Интерфейс Laravel

0

Недавно я наткнулся на интерфейс из книги "Laravel 4 From Apprentice to Artisan" с примером вроде этого:

interface UserRepositoryInterface {
    public function all();
}

class DbUserRepository implements UserRepositoryInterface {
    public function all()
    {
        return User::all()->toArray();
    }
} 

Что такое интерфейс? Где поместить файл интерфейса?

Теги:
laravel-4

1 ответ

4
Лучший ответ

Интерфейс - это "контракт" между собой и любым классом, который реализует интерфейс. Контракт гласит, что любой класс, реализующий интерфейс, должен иметь все методы, определенные в интерфейсе. В этом случае DbUserRepository должен иметь метод с именем "all()" или произойдет фатальная ошибка при создании экземпляра класса.

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

Цель интерфейса заключается в следующем: скажите, что вы хотите изменить свое приложение с помощью базы данных (и Eloquent), а теперь вместо этого вы отправляете данные хранилища в файлы JSON и пишете свои собственные методы взаимодействия с вашими файлами JSON. Теперь вы можете создать новый репозиторий, например JSONRepository, и внедрить его UserRepositoryInterface, и поскольку интерфейс заставляет вас определять все те же методы, которые определены в интерфейсе, теперь вы можете быть уверены, что ваше приложение будет продолжать работать так же, как и оно. Все это без необходимости изменять существующий код.

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

Другим примером используемых интерфейсов может быть:

Скажем, у вас есть класс калькулятора, и изначально он выполняет две операции, которые он может выполнять (сложение и умножение). Но через несколько недель вам нужно добавить еще одну операцию (например, вычитание), теперь это обычно означает, что вам нужно изменить класс калькулятора и, следовательно, рискнуть его сломать. Но если вы используете интерфейс, вы можете просто создать класс Subtraction и внедрить CalculationInterface, и теперь ваше приложение будет иметь новую операцию, не касаясь существующего кода.

Пример:

Calculator.php

<?php 

class Calculator {

    protected $result = null;
    protected $numbers = [];
    protected $calculation;

    public function getResult()
    {
        return $this->result;
    }

    public function setNumbers()
    {
        $this->numbers = func_get_args();
    }

    public function setCalculation(CalculationInterface $calculation)
    {
        $this->calculation = $calculation;
    }


    public function calculate()
    {
        foreach ($this->numbers as $num)
        {
            $this->result = $this->calculation->run($num, $this->result);
        }

        return $this->result;
    }


}

CalculationInterface.php

<?php 

interface CalculationInterface {

    public function run($num, $current);
}

Addition.php

<?php 

class Addition implements CalculationInterface {

    public function run($num, $current)
    {
        return $current + $num;
    }
}

Multiplication.php

<?php 

class Multiplication implements CalculationInterface {

    public function run($num, $current)
    {
        /* if this is the first operation just return $num
            so that we don't try to multiply $num with null */
        if (is_null($current))
            return $num;

        return $current * $num;
    }
}

Затем для запуска метода расчета:

$this->calc = new Calculator;
$this->calc->setNumbers(5, 3, 7, 10);
$this->calc->setCalculation(new Addition);
$result = $this->calc->calculate(); //$result = 25 

Теперь, если вы хотите добавить новую операцию, пусть сказать "Вычитание", вы просто создаете класс Subtraction и реализуете CalculationInterface:

<?php 

class Subtraction implements CalculationInterface {

    public function run($num, $current)
    {

        /* if this is the first operation just return $num
        so that we don't try to subtract from null */
        if (is_null($current))
            return $num;

        return $current - $num;
    }
}

Затем запустить его:

$this->calc = new Calculator;
$this->calc->setNumbers(30, 3, 7, 10);
$this->calc->setCalculation(new Subtraction);
$result = $this->calc->calculate(); //$result = 10 

Таким образом, в этом примере вы разбиваете свои функции на более мелкие классы, чтобы вы могли добавлять, удалять или даже изменять их, не нарушая что-то еще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню