Фасад — Сервис провайдер — Сервис контейнер – как это работает. Фреймворк Laravel

Фасад - Сервис провайдер - Сервис контейнер – как это работает. Фреймворк Laravel

От автора: в данном уроке я хотел бы на небольшом примере разобрать такую связку как Фасад — Сервис провайдер — Сервис контейнер для фреймворка Laravel. И на это есть несколько причин, первая это то, что многие начинающие разработчики просто не понимают, как данная связка работает, при том, что изучают указанный фреймворк достаточно долго и вполне могут реализовать на нем проект среднего уровня сложности. И вторая – использование выше упомянутой связки, позволит Вам внедрить некий собственный функционал, не предусмотренный базовой комплектацией.

скачать урок скачать исходники

В данном уроке я постараюсь на примере небольшого тестового скрипта продемонстрировать работу указанной выше связки. При этом мы с Вами создадим простой валидатор даты. Конечно, Вы можете сказать, что во фреймворке, в базовой комплектации, присутствует данный инструмент. И Вы будете правы – данный механизм есть и работает превосходно. Мы же реализуем скрипт проверки даты на корректность, который, можно использовать абсолютно везде, как в контроллерах, так и в шаблонах.

Итак, в файловой структуре фреймворка, в каталоге app, создадим папку Services и добавим в нее файл DateCheck со следующим содержимым:

Фреймворк Laravel. Быстрая разработка с фреймворком №1

Узнай тонкости современной веб-разработки с помощью фреймворка Laravel

Узнать подробнее
<?php
namespace App\Services;

class DateCheck {
 public function isValid($strDate, $strFormat = "d/m/Y", $str_timezone = FALSE) {
  $date = \DateTime::createFromFormat($strFormat,$strDate);
  if($date && (int)$date->format('Y') < 1900) {
 return false;
  }
 
  return $date && \DateTime::getLastErrors()["warning_count"] == 0 && \DateTime::getLastErrors()["error_count"] == 0;
 }
}

Валидатор, состоит всего лишь из одного метода, который в случае корректной даты возвращает true. При этом дата и ее формат, передаются в качестве соответствующих аргументов. Далее используя стандартный класс PHP DateTime, мы пытаемся создать объект указанного класса, используя переданную дату. Если ошибок нет – возвращаем true.

Теперь давайте попытаемся использовать код написанного класса. Для этого в контроллере создадим объект данного класса и вызовем на исполнение isValid().

$ext = new DateCheck();
dump($ext->isValid('25/01/2018'));

Но хоть данный код и работает – он не совсем отвечает методике и технике работы с фреймворком Laravel. Согласитесь, что для фремворка, указанный код, должен быть преобразован к следующему виду.

dump (DateCheck::isValid(‘25/01/2018’));

Указанная проблема в полной мере решается с использованием Сервис контейнера. Сервис контейнер — это мощное средство для управления зависимостями классов и внедрения зависимостей. Это своего рода контейнер, для хранения объектов. Причем каждый объект в контейнере, располагается под своим ключом, что гарантирует быстрое получение необходимых данных.

Следующий элемент, который нам понадобиться – это сервис провайдер, которых еще называют поставщики услуг. Указанный элемент, как правило, связывает некий объект с сервис контейнером, то есть добавляет в одну из его ячеек, необходимый объект.

Поэтому для реализации сервиc провайдера в папке Providers, создадим файл DateCheckServiceProvider.php со следующим содержимым:

Dump (DateCheck::isValid(‘25/01/2018’));
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class DateCheckServiceProvider extends ServiceProvider {
 public function register () {
  $this->app->bind('dateCheck','App\Services\DateCheck');
 }
}

При создании провайдера, обязательно необходимо наследовать класс Illuminate\Support\ServiceProvider, а так же реализовать метод register, в котором при помощи метода bind, добавляется в сервис контейнер, объект класса App\Services\DateCheck, в ячейку с ключом ‘dateCheck’.

Теперь пришло время вспомнить о фасадах. Фасады предоставляют «статический» интерфейс к классам, доступным в сервис-контейнере. Почему статический, спросите Вы? Потому как вызываться метод будет точно так же как и обычный статический метод.

Поэтому в каталоге app, создадим папку Providers и добавим в нее файл.

<?php
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class DateService extends Facade {
 protected static function getFacadeAccessor() {
  return 'dateCheck';
 }
}

При создании фасада обязательно следует наследовать Illuminate\Support\Facades\Facade, а так же переопределять метод getFacadeAccessor(), который в качестве результата работы должен вернуть в виде строки имя ключа в сервис контейнере для соответствующего объекта.

Теперь осталось лишь в конфигурационном фале app.php добавить созданный провайдер, для инициализации с загрузкой фреймворка (массив providers).

'App\Providers \ExcelServiceProvider',

А так же можно добавить псевдоним.

DateService => App\Facades\DateService,

Теперь можно тестировать наше небольшое дополнение.

dump (DateService::isValid('25/01/2018'));

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

Фреймворк Laravel. Быстрая разработка с фреймворком №1

Узнай тонкости современной веб-разработки с помощью фреймворка Laravel

Узнать подробнее

Фреймворк Laravel: теория и первая практика

Овладейте азами фреймворка Laravel!

Получить

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree