facades crear consultas anidadas php laravel facade

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.



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