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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Метки:

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

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

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