Laravel - Договоры: Пособие для начинающих

Здравствуйте, будущие маги Laravel! Сегодня мы отправимся в увлекательное путешествие в мир Laravel Contracts. Не беспокойтесь, если вы новички в программировании - я буду вашим дружественным проводником, и мы будем идти шаг за шагом. К концу этого руководства у вас будет прочное понимание того, что такое Contracts и как они могут сделать ваши приложения Laravel более гибкими и мощными.

Laravel - Contracts

Что такое Laravel Contracts?

Представьте, что вы строите огромную конструкцию из Лего. Не было бы замечательно, если бы вы могли легко заменить некоторые детали, не разрушая все остальное? Именно это позволяют нам делать с кодом Laravel Contracts!

На техническом языке, Laravel Contracts - это набор интерфейсов, которые определяют основные услуги, предоставляемые фреймворком. Они служат "договором" между вами и фреймворком, гарантируя, что определенные методы всегда будут доступны, независимо от конкретной реализации.

Why Use Contracts?

  1. Гибкость: Contracts упрощают замену компонентов вашего приложения.
  2. Ясность: Они предоставляют четкий и краткий API для функций фреймворка.
  3. Тестированность: Contracts упрощают написание единичных тестов для вашего кода.

Давайте углубимся с примерами!

Ваш первый Contract: Cache

Один из самых commonly используемых Contracts в Laravel - это Cache Contract. Давайте посмотрим, как мы можем его использовать:

use Illuminate\Contracts\Cache\Repository as Cache;

class UserController
{
protected $cache;

public function __construct(Cache $cache)
{
$this->cache = $cache;
}

public function showProfile($id)
{
$user = $this->cache->remember('user.'.$id, 3600, function() use ($id) {
return User::find($id);
});

return view('user.profile', ['user' => $user]);
}
}

В этом примере мы используем Cache Contract для хранения и retrieval пользовательских данных. Давайте разберем это:

  1. Мы импортируем Cache Contract с помощью use Illuminate\Contracts\Cache\Repository as Cache;
  2. В конструкторе мы внедряем экземпляр Cache Contract.
  3. В методе showProfile мы используем метод remember для retrieval пользователя из кэша или, если он не существует, получаем его из базы данных и храним в кэше на час (3600 секунд).

Прелесть использования Contract здесь в том, что нам не нужно беспокоиться о конкретной реализации кэширования. Это может быть Redis, Memcached или даже файловое кэширование - наш код останется тем же!

Мощь зависимостей

Вы, возможно, заметили, что мы не создали экземпляр Cache ourselves. Вместо этого мы попросили его в конструкторе. Это называется Зависимое инжектирование, и это ключевой концепт в Laravel.

Когда Laravel создает экземпляр нашей UserController, он видит, что мы просим Cache в конструкторе. Laravel затем ищет, какую конкретную реализацию он должен использовать для Cache Contract и автоматически предоставляет ее нашему контроллеру.

Это делает наш код более гибким и легким для тестирования. Мы могли бы легко заменить реализацию кэширования в наших тестах, не изменяя код контроллера!

Common Laravel Contracts

Laravel предоставляет множество Contracts "из коробки". Вот некоторые из самых commonly используемых:

Contract Описание
Cache Предоставляет методы для кэширования данных
Queue Позволяет откладывать обработкуresource-задач
Auth Обрабатывает аутентификацию и авторизацию
Mail Предоставляет методы для отправки электронной почты
Filesystem Предоставляет unified API для работы с локальным и облачным хранилищем файлов

Создание своих Contracts

По мере того, как вы станете более комфортно чувствовать себя в Laravel, вы можете захотеть создать свои Contracts. Давайте создадим простой для гипотетического сервиса погоды:

// app/Contracts/WeatherService.php
namespace App\Contracts;

interface WeatherService
{
public function getCurrentTemperature(string $city): float;
public function getForecast(string $city, int $days): array;
}

Теперь мы можем создать реализацию этого Contract:

// app/Services/OpenWeatherMapService.php
namespace App\Services;

use App\Contracts\WeatherService;

class OpenWeatherMapService implements WeatherService
{
public function getCurrentTemperature(string $city): float
{
// Реализация с использованием OpenWeatherMap API
}

public function getForecast(string $city, int $days): array
{
// Реализация с использованием OpenWeatherMap API
}
}

Чтобы использовать это в нашем приложении, мы свяжем нашу реализацию с Contract в провайдере сервисов:

// app/Providers/AppServiceProvider.php
use App\Contracts\WeatherService;
use App\Services\OpenWeatherMapService;

public function register()
{
$this->app->bind(WeatherService::class, OpenWeatherMapService::class);
}

Теперь, где бы мы ни needed погодные данные в нашем приложении, мы можем просто использовать типизированный hint на Contract:

use App\Contracts\WeatherService;

class WeatherController
{
protected $weather;

public function __construct(WeatherService $weather)
{
$this->weather = $weather;
}

public function index(Request $request)
{
$temperature = $this->weather->getCurrentTemperature($request->city);
return view('weather', ['temperature' => $temperature]);
}
}

Прелесть этого подхода в том, что если мы later решим перейти на другой API погоды, нам нужно будет только создать новую реализацию и обновить наш провайдер сервисов. Остальная часть кода нашего приложения останется неизменной!

Заключение

Поздравления! Вы сделали первые шаги в мир Laravel Contracts. Мы рассмотрели, что такое Contracts, почему они полезны и как их использовать в ваших приложениях Laravel. Мы даже создали свой Contract и реализацию!

Помните, Contracts - это все о том, чтобы определить clear API для компонентов вашего приложения. Они делают ваш код более гибким, легким для понимания и проще для тестирования. По мере того, как вы продолжите свое путешествие в Laravel, вы найдете越来越多 способов использовать Contracts для создания robust, maintainable приложений.

Продолжайте практиковаться, оставайтесь любопытными, и скоро вы станете профи в Laravel Contracts! Счастливого кодирования!

Credits: Image by storyset