Как создать класс фасада с помощью 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
и запустил composer update
и composer dump-autoload
.
Теперь, когда я пытаюсь запустить Foo::method()
, я получаю Non-static method Mynamespace\Foo::method() should not be called statically
. Что я делаю неправильно?
Ответы
Ответ 1
Шаг 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
в config/app.php
.
'providers' => array(
...
'MyServiceProvider'
)
Шаг 7
Запустите composer dump
, чтобы мы могли получить доступ к нашим новым классам.
Шаг 8
Теперь вы можете получить доступ к MyClassAlias::method()
как к фасаду.
Ответ 2
Это хорошо объяснено в этом сообщении: http://fideloper.com/create-facade-laravel-4
Надеюсь, что это поможет
Ответ 3
Шаг 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();
Ответ 4
Простой метод Laravel 5:
Чтобы создать фасад, вам понадобятся 3 компонента:
- Вы хотите стать классом фасадов, который должен стать доступным через фасад.
- Требуется класс Facade.
- Поставщик услуг, который регистрирует класс 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();