Какво е интерфейс на Laravel?
Laravel интерфейс е договор за това какви методи ще се използват в конкретен клас. Всъщност интерфейсите не са специфични за Laravel или дори за родния PHP по този въпрос. Тъй като работихме с Laravel, ще говорим за интерфейси в Laravel.
Ако разработвате малко приложение, няма нужда да използвате хранилища. Въпреки това, в случай, че искате да създавате мащабируеми приложения и да организирате своя код, хранилищата ще ви помогнат много.
Какво представлява моделът на хранилището?
Хранилището представлява архитектурен слой, който управлява комуникацията между приложението и източника на данни. Това е широко използван модел, чиято основна точка е, че приложението не трябва да знае кой източник на данни е внедрен и как е внедрен. Това улеснява превключването към друг източник на данни или прилагането на структурни промени в съществуващия източник на данни.
Моделът на хранилище въвежда интерфейс на хранилище, който определя как трябва да комуникират приложението и източниците на данни. Всеки източник на данни има свой собствен клас, който реализира интерфейса на хранилището. Класът на контролера ще извика методите, дефинирани в интерфейса на хранилището, и няма да знае как и откъде се извличат данните.
Сега нека поговорим за интерфейсите.
Първо, какво представляват интерфейсите?
- Интерфейсите са 100% абстрактни класове - те имат методи, но методите нямат "сърца".
- Интерфейсите не могат да бъдат инстанцирани — те са конструкция в ООП, която ви позволява да инжектирате „качества“ в класове .. като абстрактни класове.
- Когато абстрактен клас може да има както празни, така и работещи/конкретни методи, всички интерфейсни методи трябва да са обвивки — тоест трябва да се остави на класа (използващ интерфейса) да изпълни методите.
Запомнете: когато клас използва/имплементира интерфейс, класът ТРЯБВА да дефинира всички методи/функции на интерфейса, в противен случай php машината ще изведе грешка.
ОСНОВНИ ЦЕЛИ НА ИНТЕРФЕЙСА:
- Интерфейсите ви позволяват да дефинирате/създадете обща структура за вашите класове — за да зададете стандарт за обекти.
- Интерфейсите решават проблема с единичното наследяване - те ви позволяват да инжектирате „качества“ от множество източници.
- Интерфейсите осигуряват гъвкава основна/основна структура, която не получавате с класовете.
- Интерфейсите са страхотни, когато имате множество програмисти, работещи по един проект — можете да създадете свободна структура, която програмистите да следват и да ги оставите да се тревожат за детайлите.
Сега може би се чудите кога трябва да използвам хранилище вместо интерфейс или обратното.
КОГА ТРЯБВА ДА НАПРАВИТЕ INTEFACE?
- Ако имате клас, който никога не се инстанцира директно във вашата програма, това е добър кандидат за интерфейс. С други думи, ако създавате клас, който да служи само като родител на други класове, той вероятно трябва да се превърне в интерфейс.
- Когато знаете какви методи трябва да има един клас, но не сте сигурни какви ще бъдат подробностите.
- Когато искате бързо да начертаете основните структури на вашите класове, за да служите като шаблон, който другите да следват - поддържа кодовата база предсказуема и последователна.
Приложение — персонализиран интерфейс
Приложение\Хранилища\Потребител
UserInterface.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); } }
App\Http\Controllers;
UserController.php
public function __construct(UserRepository $user) { $this->user = $user; } public function index() { return $dene = $this->user->getAll(); }