Какво е интерфейс на 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();
}

http://localhost:8000/user: