Что такое интерфейс Laravel?
Laravel interface — это соглашение о том, какие методы будут использоваться в конкретном классе. На самом деле интерфейсы не являются специфическими для Laravel или даже для нативного PHP, если уж на то пошло. Поскольку мы хорошо знакомы с Laravel, мы поговорим об интерфейсах в Laravel.
Если вы разрабатываете небольшое приложение, нет необходимости использовать репозитории. Однако, если вы хотите создавать масштабируемые приложения и организовывать свой код, вам очень помогут репозитории.
Что такое шаблон репозитория?
Репозиторий представляет собой архитектурный уровень, обеспечивающий связь между приложением и источником данных. Это широко используемый шаблон, суть которого в том, что приложению не нужно знать, какой источник данных реализован и как он реализован. Это упрощает переключение на другой источник данных или внесение структурных изменений в существующий источник данных.
Шаблон репозитория представляет интерфейс репозитория, который определяет способ взаимодействия приложения и источников данных. Каждый источник данных имеет свой класс, реализующий интерфейс репозитория. Класс контроллера будет вызывать методы, определенные в интерфейсе репозитория, и не будет знать, как и откуда берутся данные.
Теперь поговорим об интерфейсах.
Во-первых, что такое интерфейсы?
- Интерфейсы — это на 100% абстрактные классы — у них есть методы, но у методов нет «внутренностей».
- Интерфейсы не могут быть созданы — они представляют собой конструкцию в ООП, которая позволяет вам внедрять «качества» в классы… как абстрактные классы.
- Там, где абстрактный класс может иметь как пустые, так и работающие/конкретные методы, все интерфейсные методы должны быть оболочками — то есть, это должно быть предоставлено классу (использующему интерфейс) для конкретизации методов.
Помните: когда класс использует/реализует интерфейс, класс ДОЛЖЕН определять все методы/функции интерфейса, иначе механизм php выдаст ошибку.
ОСНОВНЫЕ НАЗНАЧЕНИЯ ИНТЕРФЕЙСА:
- Интерфейсы позволяют вам определять/создавать общую структуру для ваших классов — устанавливать стандарт для объектов.
- Интерфейсы решают проблему одиночного наследования — они позволяют внедрять «качества» из нескольких источников.
- Интерфейсы обеспечивают гибкую базовую/корневую структуру, которую вы не получаете с классами.
- Интерфейсы хороши, когда над проектом работает несколько программистов — вы можете создать свободную структуру для программистов и позволить им беспокоиться о деталях.
Теперь вам может быть интересно, когда я должен использовать репозиторий вместо интерфейса или наоборот.
КОГДА НУЖНО СОЗДАВАТЬ ИНТЕРФЕЙС?
- Если у вас есть класс, который никогда не создается напрямую в вашей программе, это хороший кандидат на роль интерфейса. Другими словами, если вы создаете класс, который будет служить только родителем для других классов, его, вероятно, следует превратить в интерфейс.
- Когда вы знаете, какие методы должны быть у класса, но не уверены, какие именно будут детали.
- Если вы хотите быстро наметить базовые структуры ваших классов, чтобы они служили шаблоном для других, держите кодовую базу предсказуемой и согласованной.
Приложение — Пользовательский интерфейс
Приложение\Репозитории\Пользователь
Пользовательский интерфейс.php:
<?php namespace App\Repositories\User; interface UserInterface { public function getAll(); public function find($id); public function delete($id); }
UserRepoServiceProvide.php:
<?php namespace App\Repositories\User; use Illuminate\Support\ServiceProvider; class UserRepoServiceProvide extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { } /** * Register the application services. * * @return void */ public function register() { $this->app->bind('App\Repositories\User\UserInterface', 'App\Repositories\User\UserInterface'); } }
UserRepository.php
<?php namespace App\Repositories\User; use App\Models\User; use App\Repositories\User\UserInterface as UserInterface; class UserRepository implements UserInterface { public $user; function __construct(User $user) { $this->user = $user; } public function getAll() { return $this->user->get(); } public function find($id) { return $this->user->find($id); } public function delete($id) { return $this->user->delete($id); } }
Приложение\Http\Контроллеры;
UserController.php
public function __construct(UserRepository $user) { $this->user = $user; } public function index() { return $dene = $this->user->getAll(); }