Как создать класс фасада с помощью Laravel?

У меня возникла небольшая проблема с созданием класса модели фасадов с Laravel. Я следил за http://laravel.com/docs/facades, но, похоже, я что-то упускаю.

Я создал папку в app/models под названием foo . В этой папке у меня есть два файла.

Первый файл (Foo.php):

 <?php namespace Mynamespace; class Foo { public function method() { } } ?> 

Второй файл (FooFacade.php):

 <?php use Illuminate\Support\Facades\Facade; class Foo extends Facade { protected static function getFacadeAccessor() { return 'foo'; } } ?> 

Затем я добавил Foo => 'Mynamespace\Foo' в массив aliases в app/config/app.php и app/config/app.php composer update composer dump-autoload .

Теперь, когда я пытаюсь запустить Foo::method() я получаю Non-static method Mynamespace\Foo::method() should not be called statically . Что я делаю не так?

Шаг 1

Создайте папку, называемую facades в папке вашего app ( app/facades ).

Шаг 2

Добавьте папку фасада в автозагрузку композитора.

 "autoload": { "classmap": [ ... "app/facades" ] }, 

Шаг 3

Создайте файл фасада в этой папке ( FooFacade.php ) и добавьте это содержимое:

 <?php use Illuminate\Support\Facades\Facade; class MyClass extends Facade { protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here } 

Шаг 4

Создайте модель в app/models ( MyClass.php ).

 <?php namespace MyNamespace; use Eloquent; // if you're extending Eloquent class MyClass extends Eloquent { ... } 

Шаг 5

Создайте новый сервис-провайдер (вы можете создать папку в приложении, называемом serviceproviders и добавить ее в автозагрузку композитора) ( 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; }); } } 

Здесь вы можете добавить новое связывание, если хотите другой фасад (не забудьте создать файл фасада, если это так).

Шаг 6

Добавьте поставщика providers массив providers в config/app.php .

 'providers' => array( ... 'MyServiceProvider' ) 

Шаг 7

Запустите composer dump чтобы мы могли получить доступ к нашим новым классам.

Шаг 8

Теперь вы можете получить доступ к MyClassAlias::method() в качестве фасада.

Это хорошо объясняется в этом сообщении: http://fideloper.com/create-facade-laravel-4

Надеюсь, поможет

Шаг 1. Создание поставщика услуг.

 <?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; }); } } 

Шаг 2. Создайте класс Фасада, который расширяет класс 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' } } 

Шаг 3. Создайте класс (TestFacade.php), где вы хотите добавить функции.

 <?php namespace App; class TestFacade{ public function dummy(){ return "Business Logic "; } } 

Шаг 4. Зарегистрируйте поставщика услуг и укажите имя псевдонима в Config \ App.php.

 'providers' => [ //... App\Providers\NewFacadeServiceProvider::class ], //Class Aliases 'aliases' => [ //... 'FacadeTester' => App\Facade\TestFacade::class, ] 

Вызовите функцию Route.php:

 Route::get('/skull',function(){ return FacadeTester::dummy(); }); 

Функция вызова в контроллере:

 return \FacadeTester::dummy(); 

Простой метод Laravel 5:

Для создания фасада вам понадобятся 3 компонента:

  • Хочется быть Фасадным классом, классом, который должен стать доступным через фасад.
  • Фасад требовал класса.
  • Поставщик услуг, который регистрирует класс Facade в контейнере App

Вот полный пример: в примере я создаю Facade ModulesConfig для класса ModulesConfigReaderService .

1) класс обслуживания, который должен стать доступным через фасад

 <?php namespace Hello\Services\Configuration\Portals; use Illuminate\Support\Facades\Config; class ModulesConfigReaderService { public function getSomething() { return 'Whatever'; } } 

это очень обычный класс

2) требуемый класс фасада

 <?php namespace Hello\Services\Configuration\Facade; use Illuminate\Support\Facades\Facade; class ModulesConfig extends Facade { protected static function getFacadeAccessor() { return 'modulesConfigReaderService'; } } 

простой класс, простирающийся от фасада

3) поставщик услуг

 <?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'); }); } } 

поставщик услуг, который связывает все вместе.

ПРИМЕНЕНИЕ:

1) регистрировать поставщиков услуг обычно

2) доступ к классу обслуживания через фасад

 $whatever = ModulesConfig::getSomething();