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();