Как использовать один и тот же метод в контроллерах и ячейках в cakephp 3.7? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть служебный метод в моем AppController, и мне нужно использовать этот метод внутри Cell (backend).

Есть ли стандартный способ использовать один и тот же метод в обоих местах? Я не хочу дублировать код.

1 Ответ

2 голосов
/ 01 мая 2019

Я не думаю, что существует стандартное соглашение о совместном использовании функций между Cell и Controllers, это может быть признаком плохого разделения проблем (но не обязательно!). Сначала я бы удостоверился, что эта функция на самом деле является «утилитой», а в целом не лучше реализуется каким-либо другим способом ...

Тем не менее, возможно, есть несколько способов выполнения общих функций:

Вариант A - Создать класс утилит

Cake сам помещает свои служебные классы в src/Utility, например Hash class . В нем явно не указано использование этой структуры каталогов в документации для ваших собственных утилит, но я предполагаю, что именно там они и предложат, если они это сделают.

Вставьте метод в статический класс Utility:

namespace App\Utility;

class Gravitar {
    public static function getUrl($username){
        // the function
    }
}

А затем свяжите его с этим пространством имен в каждом месте, например, в Controller:

namespace App\Controller;

use App\Utility\Gravitar;

class PeopleController {

    public function view(){
        // Normal view etc.

        // Call by 
        Gravitar::getUrl($username );
    }
}

Вариант B - Создать черту

Вставьте функцию в черту. Я сделал бы ТОЛЬКО, если вы не можете сделать функцию статичной (и если вы не можете, это может быть плохим знаком, вероятно, это не настоящая «утилита»).

Там нет обычного места, чтобы поставить общую черту. Вы можете поместить его с другими чертами контроллера в src/Controller/Traits, сослаться на него в ячейке:

namespace App\View\Cell;

use App\Controller\Traits\GravitarTrait;

class PeopleCell {

    use GravitarTrait;

    public function display(){
        // Normal cell display function.

        // Call by direct reference
        $this->getUrl($username);
    }
}
...