PHP заставляет класс иметь определенный метод, если переменная класса была установлена - PullRequest
0 голосов
/ 11 октября 2018

У меня есть простое требование, в котором я хочу разрешить классу (модели Laravel) определить, должен ли контроллер проверять, разрешено ли его удаление или нет, на основе переменной класса, например

public $verify_delete = true;

В настоящее время, если эта переменная установлена, я должен добавить следующий метод:

public function deletable()
{
    $deletable = true;

    if ($this->has_children()) {
        $deletable = false;
    }

    // ...

    return $deletable;
}

Первая переменная просто указывает, что код, выполняющий этот класс, должен также запускать метод deletable().

Итак, мне нужен способ заставить разработчика реализовать метод deletable(), если они установили для $verify_delete значение true , и выдать ошибку, если они этого не сделали.Я не очень разбираюсь в traits и implements на данном этапе, поэтому я не уверен, что это правильный путь для спуска.

Если это не лучший способ для достижениячто я после того, как я все уши.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы задаетесь вопросом: могу ли я определить, вызывается ли метод в классе, когда задано определенное свойство ...

Другие (очень мудрые) решения предлагают интерфейсы и признаки ... AСовершенно прекрасная идея и действительно хороший способ взглянуть на вещи.

Но вы также можете придумать что-то вроде этого:

public function __construct() {
    if (true === $this->verify_delete && !method_exists($this, 'deletable')) {
        throw new \Exception('Hi developer! You forgot something...');
    }
}

Объяснение:

  • в конструкторе вы проверяете, является ли свойство истинным.
  • если метод не существует, давайте сгенерируем исключение

Я думаю, что это именно так, как вы просите: заставить разработчика реализовать удаляемый метод, когда свойство установлено.

Но, если честно, мне действительно нравятся эти черты ... Я просто хотел дать вам альтернативу, которая тоже подходит, если вам не слишком удобны такие техники, как интерфейсы, черты и т. Д.

0 голосов
/ 11 октября 2018

Вы должны создать черту с именем Deletable или Removeable или что-то в этом духе и реализовать этот метод удаления, и тогда каждая модель, которую можно удалить, будет use этой чертой.Не совсем то, что вы хотели, но это правильный подход.

Или

Вы можете создать интерфейс, который будет иметь этот метод внутри, а затем каждый класс (model), который реализует этот интерфейс, должен будетреализовать метод, единственное отличие состоит в том, что реализация может отличаться в зависимости от модели от других

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...