Laravel (5,7) Фасады
Вступление
Фасады предоставляют «статический» интерфейс для классов, которые доступны в контейнере службы приложения. Laravel поставляется с множеством фасадов, которые обеспечивают доступ почти ко всем функциям Laravel.
Все фасады Laravel определены в пространстве имен Illuminate / Support / Facade. Таким образом, мы можем легко получить доступ к фасаду, как это:
Давайте посмотрим на простой пример.
use Illuminate\Support\Facades\Cache;
Route::get('/cache', function () {
return Cache::get('key');
});
Когда использовать Фасады
Фасады имеют больше преимуществ. Они предоставляют короткий запоминающийся синтаксис, который позволяет использовать функции Laravel без запоминания длинных имен классов, которые должны быть введены или настроены вручную. Благодаря уникальному использованию динамических методов PHP, их легко тестировать. Основная опасность фасадов - ползучесть класса. Поскольку фасады настолько просты в использовании и не требуют инъекций, может быть легко позволить вашим классам продолжать расти и использовать множество фасадов в одном классе.
При создании стороннего пакета, взаимодействующего с laravel, лучше вводить контракты Laravel, а не использовать фасады. Поскольку пакеты создаются вне самого Laravel, у вас не будет доступа к помощнику по тестированию фасада Laravel.
Фасады Vs. Внедрение зависимости
Одним из основных преимуществ внедрения зависимостей является возможность обмена реализациями внедренного класса. Это полезно во время тестирования, поскольку вы можете ввести макет или заглушку и утверждать, что для заглушки были вызваны различные методы.
Как правило, было бы невозможно смутить или заглушить действительно статический метод класса. Тем не менее, поскольку фасады используют динамические методы для передачи вызовов методов для объектов, разрешенных из сервисного контейнера, мы фактически можем тестировать фасады так же, как мы проверяем экземпляр внедренного класса.
Давайте посмотрим на простой пример.
use Illuminate\Support\Facades\Cache;
Route::get('/cache', function () {
return Cache::get('key');
});
Мы можем написать следующий тест, чтобы убедиться, что метод cache :: get был вызван с аргументом.
Давайте посмотрим на простой пример.
use Illuminate\Support\Facades\Cache;
public function testBasicExample()
{
Cache::shouldReceive('get')
->with('key')
->andReturn('value');
$this->visit('/cache')
->see('value');
}
Фасады Vs. Вспомогательные функции
Laravel включает в себя множество вспомогательных функций, которые могут выполнять общие задачи, такие как генерация представлений, запуск событий, диспетчеризация заданий или отправка HTTP-ответов. Многие из этих вспомогательных функций выполняют ту же функцию, что и соответствующий фасад.
return View::make('profile');
return view('profile');
Нет разницы между фасадами и вспомогательной функцией. При использовании вспомогательных функций вы все равно можете тестировать их точно так же, как вы хотите для соответствующих фасадов.
Route::get('/cache', function () {
return cache('key');
});
Помощник кэша собирается вызвать метод get для класса, лежащего в основе фасадов кэша. Итак, хотя мы используем вспомогательную функцию, мы можем написать следующий тест, чтобы убедиться, что метод был вызван с ожидаемым аргументом:
Давайте посмотрим на простой пример.
use Illuminate\Support\Facades\Cache;
public function testBasicExample()
{
Cache::shouldReceive('get')
->with('key')
->andReturn('value');
$this->visit('/cache')
->see('value');
}
Как работают фасады
Фасад - это класс, который обеспечивает доступ к объекту из контейнера. Техника, которая делает эту работу, относится к классу фасадов. Фасады Laravel и любые другие созданные вами фасады расширят базовый класс Illuminate / Support / Facades / Facade.
Базовый класс Facade использует магический метод __callStatic (), чтобы отложить вызовы от вашего фасада до объекта, разрешенного из контейнера.
Давайте посмотрим на простой пример.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class UserController extends Controller
{
public function showProfile($id)
{
$user = Cache::get('user:'.$id);
return view('profile', ['user' => $user]);
}
}
Обратите внимание, что в верхней части файла мы «импортируем» фасад кэша. Этот фасад служит прокси для доступа к базовой реализации интерфейса Illuminate / Contracts / Cache / Factory. Любые звонки, которые мы делаем с помощью фасада, будут переданы в базовый экземпляр службы кэширования Laravel.
Давайте посмотрим на простой пример.
class Cache extends Facade
{
protected static function getFacadeAccessor() { return 'cache'; }
}
Вместо этого фасад кэша расширяет базовый класс фасада и определяет метод getFacadeAccessor (). Задача этого метода - вернуть имя привязки контейнера службы.
Предыдущая: Laravel (5.7) Провайдеры услуг
Далее: Laravel (5.7) Контракты
Новый контент: Composer: менеджер зависимостей для PHP , R программирования