У меня возникла небольшая проблема с созданием класса модели фасадов с 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
. Что я делаю не так?
Создайте папку, называемую facades
в папке вашего app
( app/facades
).
Добавьте папку фасада в автозагрузку композитора.
"autoload": { "classmap": [ ... "app/facades" ] },
Создайте файл фасада в этой папке ( FooFacade.php
) и добавьте это содержимое:
<?php use Illuminate\Support\Facades\Facade; class MyClass extends Facade { protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here }
Создайте модель в app/models
( MyClass.php
).
<?php namespace MyNamespace; use Eloquent; // if you're extending Eloquent class MyClass extends Eloquent { ... }
Создайте новый сервис-провайдер (вы можете создать папку в приложении, называемом 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; }); } }
Здесь вы можете добавить новое связывание, если хотите другой фасад (не забудьте создать файл фасада, если это так).
Добавьте поставщика providers
массив providers
в config/app.php
.
'providers' => array( ... 'MyServiceProvider' )
Запустите composer dump
чтобы мы могли получить доступ к нашим новым классам.
Теперь вы можете получить доступ к 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 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();