Может войдёшь?
Черновики Написать статью Профиль

Фасады

перевод документация 5.х

  1. 1. Введение
  2. 2. Использование фасадов
  3. 3. Создание фасадов
    1. 3.1. Об автозагрузке псевдонимов
  4. 4. Фасады-заглушки
  5. 5. Соответствие фасадов и классов
Этот перевод актуален для англоязычной документации на (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Фасады предоставляют «статический» интерфейс к классам, доступным в сервис-контейнере. Laravel поставляется со множеством фасадов и вы, вероятно, использовали их, даже не подозревая об этом. «Фасады» Laravel служат «статическими прокси» для классов в сервис-контейнере, обеспечивая преимущества краткого выразительного синтаксиса, и поддерживая большую тестируемость и гибкость, чем традиционные статические методы.

Использование фасадов

В контексте приложения на Laravel, фасад — это класс, который предоставляет доступ к объекту в контейнере. Весь этот механизм реализован в классе PHPFacade. И фасады Laravel, и ваши собственные, наследуют базовый класс Illuminate\Support\Facades\Facade.

Ваш фасад должен реализовать единственный метод: PHPgetFacadeAccessor(). Его задача — определить, что вы хотите получить из контейнера. Базовый класс PHPFacade использует магический метод PHP PHP__callStatic() для перенаправления вызовов методов с вашего фасада на полученный объект.

В примере ниже делается обращение к механизму кэширования Laravel. На первый взгляд может показаться, что метод PHPget() принадлежит классу PHPCache:

PHP
<?php

namespace App\Http\Controllers;

use 
Cache;
use 
App\Http\Controllers\Controller;

class 
UserController extends Controller
{
  
/**
   * Показать профиль данного пользователя.
   *
   * @param  int  $id
   * @return Response
   */
  
public function showProfile($id)
  {
    
$user Cache::get('user:'.$id);

    return 
view('profile', ['user' => $user]);
  }
}

Обратите внимание, в начале мы «импортируем» фасад Cache. Этот фасад служит переходником для доступа к лежащей в основе реализации интерфейса Illuminate\Contracts\Cache\Factory. Все выполняемые через этот фасад вызовы передаются ниже — в экземпляр кэш-сервиса Laravel.

Если вы посмотрите в исходный код класса Illuminate\Support\Facades\Cache, то увидите, что он не содержит метода PHPget():

PHP
class Cache extends Facade
{
  
/**
   * Получить зарегистрированное имя компонента.
   *
   * @return string
   */
  
protected static function getFacadeAccessor() { return 'cache'; }
}

Вместо этого, фасад Cache наследует базовый класс PHPFacade и определяет метод PHPgetFacadeAccessor(). Как вы помните, его задача — вернуть имя привязки в сервис-контейнере. Когда вы обращаетесь к любому статическому методу фасада Cache, Laravel получает по привязке объект cache из сервис-контейнера и вызывает на нём требуемый метод (в этом случае — PHPget()).

+ 5.0

добавлено в 5.0 ()

Таким образом, вызов PHPCache::get() может быть переписан так:

PHP
$value $app->make('cache')->get('key');

Импорт фасадов

Помните, если вы используете фасад в контроллере, который находится в пространстве имён, то вам надо импортировать класс фасада в пространство имён. Все фасады живут в глобальном пространстве имён:

PHP
<?php namespace App\Http\Controllers;

use 
Cache;

class 
PhotosController extends Controller {

  
/**
   * Получить все фотографии приложения.
   *
   * @return Response
   */
  
public function index()
  {
    
$photos Cache::get('photos');

    
//
  
}

}

Создание фасадов

Создать фасад в вашем приложении или пакете довольно просто. Вам нужны только три вещи:

  1. Привязка в сервис-контейнере.
  2. Класс-фасад.
  3. Настройка для псевдонима фасада.

Посмотрим на следующий пример. Здесь определён класс PHPPaymentGateway\Payment:

PHP
namespace PaymentGateway;

class 
Payment {

  public function 
process()
  {
    
//
  
}

}

Нам нужно, чтобы этот класс извлекался из сервис-контейнера, поэтому давайте добавим для него привязку (binding):

PHP
App::bind('payment', function()
{
  return new \
PaymentGateway\Payment;
});

Самое лучшее место для регистрации этой привязки — новый поставщик услуг, который мы назовём PHPPaymentServiceProvider и в котором мы создадим метод PHPregister(), содержащий представленный выше код. После этого вы можете настроить Laravel для загрузки этого поставщика в файле config/app.php.

Дальше мы можем создать класс нашего фасада:

PHP
use Illuminate\Support\Facades\Facade;

class 
Payment extends Facade {

  protected static function 
getFacadeAccessor() { return 'payment'; }

}

Наконец, по желанию можно добавить псевдоним (alias) для этого фасада в массив aliases файла настроек config/app.php. Тогда мы сможем вызывать метод PHPprocess() на экземпляре класса PHPPayment:

PHP
Payment::process();

Об автозагрузке псевдонимов

В некоторых случаях классы в массиве aliases не доступны из-за того, что PHP не загружает неопределённые классы при указании их типов. Если PHP\ServiceWrapper\ApiTimeoutException имеет псевдоним PHPApiTimeoutException, то PHPcatch (ApiTimeoutException $e), помещённый в любое пространство имён, кроме PHPServiceWrapper, никогда не «поймает» исключение, даже когда оно возникнет. Аналогичная проблема возникает в классах, которые содержат указания типов на классы с псевдонимами. Единственное решение — не использовать псевдонимы и вместо них в начале каждого файла, где это необходимо, писать PHPuse для тех классов, типы которых вы хотите указать.

Фасады-заглушки

Юнит-тесты играют важную роль в том, как именно работают фасады. На самом деле возможность тестирования — основная причина, по которой фасады вообще существуют. Эта тема подробнее раскрыта в разделе документации о фасадах-заглушках.

Соответствие фасадов и классов

В таблице ниже перечислены все фасады и соответствующие им классы. Это полезный инструмент для быстрого начала работы с документацией по API данного корня фасадов. Также указаны ключи привязок в сервис-контейнере, где это нужно.

Фасад Класс Привязка в сервис-контейнере
AppIlluminate\Foundation\Applicationapp
Artisan5.2 и 5.1 Illuminate\Contracts\Console\Kernel
5.0 Illuminate\Console\Application
artisan
AuthIlluminate\Auth\AuthManagerauth
Auth (экземпляр)Illuminate\Auth\Guard только для 5.1 и ранее
BladeIlluminate\View\Compilers\BladeCompilerblade.compiler
BusIlluminate\Contracts\Bus\Dispatcher
Cache5.2 и 5.1 Illuminate\Cache\Repository
5.0 Illuminate\Cache\CacheManager
cache
ConfigIlluminate\Config\Repositoryconfig
CookieIlluminate\Cookie\CookieJarcookie
CryptIlluminate\Encryption\Encrypterencrypter
DBIlluminate\Database\DatabaseManagerdb
DB (экземпляр)Illuminate\Database\Connection
EventIlluminate\Events\Dispatcherevents
FileIlluminate\Filesystem\Filesystemfiles
Form5.0 Illuminate\Html\FormBuilderform
Gate5.1 Illuminate\Contracts\Auth\Access\Gate
HashIlluminate\Contracts\Hashing\Hasherhash
InputIlluminate\Http\Request только для 5.1 и ранееrequest
LangIlluminate\Translation\Translatortranslator
LogIlluminate\Log\Writerlog
MailIlluminate\Mail\Mailermailer
Password5.2 и 5.1 Illuminate\Auth\Passwords\PasswordBroker
5.0 Illuminate\Auth\Reminders\PasswordBroker
auth.password
auth.reminder
QueueIlluminate\Queue\QueueManagerqueue
Queue (экземпляр)Illuminate\Queue\QueueInterface для 5.1 и ранее
Illuminate\Contracts\Queue\Queue для 5.2

queue
Queue (базовый класс)Illuminate\Queue\Queue
RedirectIlluminate\Routing\Redirectorredirect
RedisIlluminate\Redis\Databaseredis
RequestIlluminate\Http\Requestrequest
ResponseIlluminate\Contracts\Routing\ResponseFactory
RouteIlluminate\Routing\Routerrouter
SchemaIlluminate\Database\Schema\Blueprint
SessionIlluminate\Session\SessionManagersession
Session (экземпляр)Illuminate\Session\Store
StorageIlluminate\Contracts\Filesystem\Factoryfilesystem
URLIlluminate\Routing\UrlGeneratorurl
ValidatorIlluminate\Validation\Factoryvalidator
Validator (экземпляр)Illuminate\Validation\Validator
ViewIlluminate\View\Factoryview
View (экземпляр)Illuminate\View\View

Комментарии (1)

Oks_1984

Так, все-таки , пытаюсь разобраться фасады в Laravel — подпадают под определение фасадов банды четырех в ооп? Если нет, в чем разница?

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.