Есть три компонента при создания фасада:
- Корень фасада (Facade Root) — базовый класс, методы которого вызывает фасад.
- Класс фасада, который указывает Laravel, к какому зарегистрированному (базовому) классу он относится.
- Сервис-провайдер, который регистрирует базовый класс в контейнере приложения (
PHPApp
).
Сценарий использования
Предположим, у нас есть класс, для которого мы хотим сгенерировать фасад. Например, класс PHPFideloper\Example\UnderlyingClass
.
<?php namespace Fideloper\Example;
class UnderlyingClass {
public function doSomething()
{
echo 'Doing something!';
}
}
Теперь предположим, что мы хотим создать такой фасад для этого класса, который позволит разработчикам получать доступ к нему с помощью таких вызовов:
UnderlyingClass::doSomething();
Реализация
Сначала вам надо создать класс фасада:
<?php namespace Fideloper\Example\Facades;
use Illuminate\Support\Facades\Facade;
class UnderlyingClass extends Facade {
/**
* Получить зарегистрированное имя компонента.
*
* @return string
*/
protected static function getFacadeAccessor() { return 'underlyingclass'; }
}
Возвращая underlyingclass из метода-доступа фасада, мы даем понять Laravel, что класс фасада ищет PHP$app['underlyingclass']
.
Далее вам надо соединить ваш базовый класс с вашим фасадом. Это можно сделать с помощью сервис-провайдера, который сделает две вещи:
- Привяжет underlyingclass к нашему объекту
PHPUnderlyingClass
. Как уже упоминалось выше, это соединит идентификатор фасада underlyingclass с привязаннымPHP$app['underlyingclass']
. - Создаст псевдоним, используемый для доступа к базовому классу
PHPUnderlyingClass
. Этот псевдоним зарегистрирован для созданного нами фасада, который в свою очередь настроен на доступ к нашему базовому классу. Понятно? Хорошо. Примечание: установка псевдонима в сервис-провайдере — это создание ярлыка, поэтому вам не надо беспокоиться о добавлении записи в псевдонимы в app/config/app.php. На мой взгляд, добавление псевдонима в сервис-провайдере проще для разработчиков — просто подключите сервис-провайдер в app/config/app.php и продолжайте работу!
<?php namespace Fideloper\Example;
use Illuminate\Support\ServiceProvider;
class ExampleServiceProvider extends ServiceProvider {
/**
* Регистрация сервис-провайдера.
*
* @return void
*/
public function register()
{
// Регистрация экземпляра контейнера 'underlyingclass' для нашего объекта UnderlyingClass
$this->app['underlyingclass'] = $this->app->share(function($app)
{
return new Fideloper\Example\UnderlyingClass;
});
// Создание ярлыка, разработчикам не надо добавлять псевдоним в app/config/app.php
$this->app->booting(function()
{
$loader = \Illuminate\Foundation\AliasLoader::getInstance();
$loader->alias('UnderlyingClass', 'Fideloper\Example\Facades\UnderlyingClass');
});
}
}
Последний шаг — зарегистрируйте ваш сервис-провайдер в файле app/config/app.php вместе с другими провайдерами, и вы сможете использовать ваш новый фасад!
'providers' => array(
... Прочие провайдеры выше ...
'Illuminate\Workbench\WorkbenchServiceProvider',
'Fideloper\Example\ExampleServiceProvider',
),
Вот и всё! Вы можете использовать ваш фасад как того и хотели:
UnderlyingClass::doSomething();