От автора: в данном уроке я хотел бы на небольшом примере разобрать такую связку как Фасад — Сервис провайдер — Сервис контейнер для фреймворка Laravel. И на это есть несколько причин, первая это то, что многие начинающие разработчики просто не понимают, как данная связка работает, при том, что изучают указанный фреймворк достаточно долго и вполне могут реализовать на нем проект среднего уровня сложности. И вторая – использование выше упомянутой связки, позволит Вам внедрить некий собственный функционал, не предусмотренный базовой комплектацией.
В данном уроке я постараюсь на примере небольшого тестового скрипта продемонстрировать работу указанной выше связки. При этом мы с Вами создадим простой валидатор даты. Конечно, Вы можете сказать, что во фреймворке, в базовой комплектации, присутствует данный инструмент. И Вы будете правы – данный механизм есть и работает превосходно. Мы же реализуем скрипт проверки даты на корректность, который, можно использовать абсолютно везде, как в контроллерах, так и в шаблонах.
Итак, в файловой структуре фреймворка, в каталоге app, создадим папку Services и добавим в нее файл DateCheck со следующим содержимым:
<?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'));
Вот собственно и все что я хотел Вам рассказать. В видео версии урока, более подробно рассказывать о каждой составляющей фреймворка. Всего Вам доброго и удачного кодирования.