php - crear - consultas anidadas laravel
¿Cómo creo una clase de fachada con Laravel? (4)
Tengo un pequeño problema al crear una clase de modelo de fachada con Laravel. He seguido http://laravel.com/docs/facades pero supongo que me falta algo.
He creado una carpeta en la app/models llamada foo . En esa carpeta tengo dos archivos.
Primer archivo (Foo.php):
<?php
namespace Mynamespace;
class Foo {
public function method() {
}
}
?>
Segundo archivo (FooFacade.php):
<?php
use Illuminate/Support/Facades/Facade;
class Foo extends Facade {
protected static function getFacadeAccessor() { return ''foo''; }
}
?>
Luego agregué Foo => ''Mynamespace/Foo'' a la matriz de aliases en app/config/app.php y ejecuté la composer update composer dump-autoload y el composer dump-autoload .
Ahora cuando intento ejecutar Foo::method() obtengo Non-static method Mynamespace/Foo::method() should not be called statically . ¿Qué estoy haciendo mal?
Paso 1
Crea una carpeta llamada facades en la carpeta de tu app ( app/facades ).
Paso 2
Agregue la carpeta de fachada a la carga automática de su compositor.
"autoload": {
"classmap": [
...
"app/facades"
]
},
Paso 3
Cree un archivo de fachada en esa carpeta ( FooFacade.php ) y agregue este contenido:
<?php
use Illuminate/Support/Facades/Facade;
class MyClass extends Facade {
protected static function getFacadeAccessor() { return ''MyClassAlias''; } // most likely you want MyClass here
}
Etapa 4
Crea un modelo en una app/models ( MyClass.php ).
<?php
namespace MyNamespace;
use Eloquent; // if you''re extending Eloquent
class MyClass extends Eloquent {
...
}
Paso 5
Cree un nuevo proveedor de servicios (puede crear una carpeta en la aplicación llamada serviceproviders y agregarla al autor de la carga automática) ( app/models/MyClassServiceProvider.php ).
<?php
use Illuminate/Support/ServiceProvider;
class MyClassServiceProvider extends ServiceProvider {
/**
* Register the service provider.
*
* @return void
*/
public function register() {
$this->app->bind(''MyClassAlias'', function(){
return new MyNamespace/MyClass;
});
}
}
Aquí puede agregar un nuevo enlace si desea otra fachada (no olvide crear un archivo de fachada si es así).
Paso 6
Agregue el proveedor de servicios a la matriz de providers en config/app.php .
''providers'' => array(
...
''MyServiceProvider''
)
Paso 7
Ejecuta el composer dump para que podamos acceder a nuestras nuevas clases.
Paso 8
Ahora puede acceder a MyClassAlias::method() como fachada.
Está bien explicado en esa publicación: http://fideloper.com/create-facade-laravel-4
Espero eso ayude
Paso 1: Crear proveedor de servicios
<?php
namespace App/Providers;
use Illuminate/Support/ServiceProvider;
class NewFacadeServiceProvider extends ServiceProvider{
public function register(){
$this->app->singleton(''TestFacades'',function() {
//''TestFacades'' alias name for the façade class
return new /App/TestFacade;
});
}
}
Paso 2: Crea una clase Fachada que amplíe la clase Illuminate / Support / Facades / Facade.
<?php
namespace App/Facade; //created ''facade'' folder in app directory
use Illuminate/Support/Facades/Facade;
class TestFacade extends Facade{
protected static function getFacadeAccessor() {
return ''TestFacades''; //''TestFacades'' alias name for the façade class declare in the class ''NewFacadeServiceProvider''
}
}
Paso 3: crea la clase (TestFacade.php) donde deseas agregar funciones.
<?php
namespace App;
class TestFacade{
public function dummy(){
return "Business Logic ";
}
}
Paso 4: registrar proveedor de servicios y proporcionar el nombre de alias en Config / App.php
''providers'' => [ //...
App/Providers/NewFacadeServiceProvider::class
],
//Class Aliases
''aliases'' => [ //...
''FacadeTester'' => App/Facade/TestFacade::class,
]
Llame a la función Route.php:
Route::get(''/skull'',function(){
return FacadeTester::dummy();
});
Función de llamada en el controlador:
return /FacadeTester::dummy();
Un simple método de Laravel 5:
Para crear una fachada necesitas 3 componentes:
- La clase Wanna Be Facade, la clase que necesita ser accesible por fachada.
- La fachada requiere clase.
- El proveedor de servicios, que registra la clase de Fachada en el contenedor de la aplicación
Aquí hay un ejemplo completo: en el ejemplo, estoy creando Facade ModulesConfig para la clase ModulesConfigReaderService .
1) la clase de servicio que necesita ser accesible a través de una fachada
<?php
namespace Hello/Services/Configuration/Portals;
use Illuminate/Support/Facades/Config;
class ModulesConfigReaderService
{
public function getSomething()
{
return ''Whatever'';
}
}
esta es una clase muy normal
2) la clase de fachada requerida
<?php
namespace Hello/Services/Configuration/Facade;
use Illuminate/Support/Facades/Facade;
class ModulesConfig extends Facade
{
protected static function getFacadeAccessor()
{
return ''modulesConfigReaderService'';
}
}
clase simple que se extiende desde la fachada
3) el proveedor del servicio
<?php
namespace Hello/Services/Configuration/Providers;
use Hello/Modules/Core/Providers/Abstracts/ServiceProvider;
class ModulesConfigServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(''modulesConfigReaderService'', function(){
return $this->app->make(''Hello/Services/Configuration/Portals/ModulesConfigReaderService'');
});
}
}
un proveedor de servicios que une todo junto.
USO:
1) registrar los proveedores de servicios normalmente
2) acceder a la clase de servicio a través de la fachada
$whatever = ModulesConfig::getSomething();