15
Мар
2018

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

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

От автора: в данном уроке я хотел бы на небольшом примере разобрать такую связку как Фасад — Сервис провайдер — Сервис контейнер для фреймворка 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'));

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

Share

Тебе может это понравится...