{{TOC}} {{DOCVER 4.0=0da300f6445bec5a70d007f503834fce957b065b 16.10.2014 5:19:26, 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03, 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15}} == Введение == Фасады предоставляют "статический" интерфейс к классам, доступным в ((docs/v4/ioc контейнере IoC)). Laravel поставляется со множеством фасадов и вы, вероятно, использовали их, даже не подозревая об этом. "Фасады" Laravel служат "статическими прокси" для классов в IoC-контейнере, обеспечивая преимущества краткого выразительного синтаксиса, и поддерживая большую тестируемость и гибкость, чем традиционные статические методы. Иногда вам может понадобиться создать собственные фасады для вашего приложения и ((docs/v4/packages пакетов)), поэтому давайте изучим идею, разработку и использование этих классов. .(alert) **Внимание:** перед погружением в фасады настоятельно рекомендуется как можно детальнее изучить ((docs/v4/ioc контейнер IoC)). == Описание == В контексте приложения на Laravel, фасад - это класс, который предоставляет доступ к объекту в контейнере. Весь этот механизм реализован в классе %%Facade%%. Фасады как Laravel, так и ваши собственные, наследуют этот базовый класс. Ваш фасад должен определить единственный метод: %%getFacadeAccessor()%%. Его задача - определить, что вы хотите получить из контейнера. Класс %%Facade%% использует ((phpdoc:language.oop5.overloading магический метод PHP)) **~__callStatic()** для перенаправления вызовов методов с вашего фасада на полученный объект. Таким образом, когда вы делаете вызов фасада %%Cache::get%%, Laravel извлекает класс управления кэшем из IoC-контейнера и вызывает метод %%get%% на класс. С технической точки зрения, фасады Laravel - удобный синтаксис для использования IoC-контейнера Laravel в качестве локатора служб. == Практическое использование == В примере ниже делается обращение к механизму кэширования Laravel. На первый взгляд может показаться, что метод %%get()%% принадлежит классу %%Cache%%: %% $value = Cache::get('key'); %% Однако, если вы посмотрите в исходный код класса %%Illuminate\Support\Facades\Cache%%, то увидите, что он не содержит метода %%get()%%: %% class Cache extends Facade { /** * Получить зарегистрированное имя компонента. * * @return string */ protected static function getFacadeAccessor() { return 'cache'; } } %% Класс %%Cache%% наследует класс %%Facade%% и определяет метод %%getFacadeAccessor()%%. Как вы помните, его задача - вернуть имя //привязки// (типа) в ((docs/v4/ioc контейнере IoC)). Когда вы обращаетесь к любому статическому методу фасада %%Cache%%, Laravel получает объект %%(t)cache%% из IoC и вызывает на нём требуемый метод (в этом случае - %%get()%%). Таким образом, вызов %%Cache::get()%% может быть записан так: %% $value = $app->make('cache')->get('key'); %% == Создание фасадов == Создать фасад в вашем приложении или ((docs/v4/packages пакете)) довольно просто. Вам нужны только три вещи: 1. Связка в ((docs/v4/ioc IoC)). 1. Класс-фасад. 1. Настройка для псевдонима фасада. Посмотрим на следующий пример. Здесь определён класс %%PaymentGateway\Payment%%. %% namespace PaymentGateway; class Payment { public function process() { // } } %% Этот класс может находиться в вашем каталоге %%(t)app/models%% или в любом другом каталоге, который добавлен в автозагрузку Composer. Нам нужно, чтобы этот класс извлекался из контейнера IoC, так что давайте добавим для него привязку (//binding//): %% App::bind('payment', function () { return new \PaymentGateway\Payment; }); %% Самое лучшее место для регистрации этой связки - новый ((docs/v4/ioc#поставщики поставщик услуг)), который мы назовём %%PaymentServiceProvider%% и в котором мы создадим метод %%register()%%, содержащий код выше. После этого вы можете настроить Laravel для загрузки этого поставщика в файле %%(t)app/config/app.php%%. Дальше мы можем написать класс нашего фасада: %% use Illuminate\Support\Facades\Facade; class Payment extends Facade { protected static function getFacadeAccessor() { return 'payment'; } } %% Наконец, по желанию можно добавить псевдоним (//alias//) для этого фасада в массив **aliases** файла настроек %%(t)app/config/app.php%% - тогда мы сможем вызывать метод %%process()%% на классе %%Payment%%: %% Payment::process(); %% == Об автозагрузке псевдонимов == В некоторых случаях классы в массиве **aliases** не доступны из-за того, что ((https://bugs.php.net/bug.php?id=39003 PHP не загружает неизвестные классы в подсказках типов)). Если %%\ServiceWrapper\ApiTimeoutException%% имеет псевдоним %%ApiTimeoutException%%, то блок %%try ... catch (ApiTimeoutException $e)%%, помещённый в любое пространство имён, кроме %%ServiceWrapper%%, никогда не "поймает" это исключение, даже если оно было возбуждено внутри него. Аналогичная проблема возникает в моделях, которые содержат подсказки типов на неизвестные (неопределённые) классы. Единственное решение - не использовать псевдонимы и вместо них в начале каждого файла писать %%use ... as%% для классов, которые вы хотите использовать в подсказках типов. == Фасады-заглушки == ((docs/v4/testing Юнит-тесты)) играют важную роль в том, почему фасады делают именно то, что они делают. На самом деле возможность тестирования - основная причина, по которой фасады вообще существуют. Эта тема подробнее раскрыта в ((docs/v4/testing#фасады-заглушки соответствующем разделе документации)). == Соответствие фасадов и классов == В таблице ниже перечислены все фасады и соответствующие им классы. Это полезный инструмент для быстрого начала работы с документацией по API данного корня фасадов. Также указаны ключи ((/docs/v4/ioc привязки IoC)), где это нужно. %%(hvlraw)
Фасад Класс Привязка IoC
App Illuminate\Foundation\Applicationapp
Artisan Illuminate\Console\Applicationartisan
AuthIlluminate\Auth\AuthManagerauth
Auth (экземпляр)Illuminate\Auth\Guard
BladeIlluminate\View\Compilers\BladeCompilerblade.compiler
CacheIlluminate\Cache\Repositorycache
ConfigIlluminate\Config\Repositoryconfig
CookieIlluminate\Cookie\CookieJarcookie
CryptIlluminate\Encryption\Encrypterencrypter
DBIlluminate\Database\DatabaseManagerdb
DB (экземпляр)Illuminate\Database\Connection
EventIlluminate\Events\Dispatcherevents
FileIlluminate\Filesystem\Filesystemfiles
FormIlluminate\Html\FormBuilderform
HashIlluminate\Hashing\HasherInterfacehash
HTMLIlluminate\Html\HtmlBuilderhtml
InputIlluminate\Http\Requestrequest
LangIlluminate\Translation\Translatortranslator
LogIlluminate\Log\Writerlog
MailIlluminate\Mail\Mailermailer
PaginatorIlluminate\Pagination\Environmentpaginator
Paginator (экземпляр)Illuminate\Pagination\Paginator
PasswordIlluminate\Auth\Reminders\PasswordBrokerauth.reminder
QueueIlluminate\Queue\QueueManagerqueue
Queue (экземпляр)Illuminate\Queue\QueueInterface
Queue (базовый класс)Illuminate\Queue\Queue
RedirectIlluminate\Routing\Redirectorredirect
RedisIlluminate\Redis\Databaseredis
RequestIlluminate\Http\Requestrequest
ResponseIlluminate\Support\Facades\Response
RouteIlluminate\Routing\Routerrouter
SchemaIlluminate\Database\Schema\Blueprint
SessionIlluminate\Session\SessionManagersession
Session (экземпляр)Illuminate\Session\Store
SSHIlluminate\Remote\RemoteManagerremote
SSH (экземпляр)Illuminate\Remote\Connection
URLIlluminate\Routing\UrlGeneratorurl
ValidatorIlluminate\Validation\Factoryvalidator
Validator (экземпляр)Illuminate\Validation\Validator
ViewIlluminate\View\Environmentview
View (экземпляр)Illuminate\View\View
%%