4

Неправильная практика создания функции в контроллере, которая не является действием?Функция Zend Framework, которая не является действием в контроллере

пример: createCookie функция ниже контроллера

protected $translator; 
protected $cookie; 

public function __construct($translator, $cookie) 
{ 
    $this->translator = $translator; 
    $this->cookie = $cookie; 
} 

public function changeLanguageAction() 
{ 
    $language = $this->params()->fromRoute('lang', 'en'); 
    $this->createCookie('xuage', $language, '/'); 
    $this->getResponse()->getHeaders()->addHeader($this->cookie); 
    $this->redirect()->toRoute('home'); 
} 

public function createCookie($name, $value, $path) 
{ 
    $this->cookie->setName($name); 
    $this->cookie->setValue($value); 
    $this->cookie->setPath($path); 
} 

ответ

1

На мой взгляд, это может привести к созданию ваш код более трудно поддерживать, в связи с тем:

  • Вы не можете поделиться «createCookie» между различными контроллерами, и вы реплицируете свои функции на разные контроллеры.
  • Даже если вы расширите свои контроллеры до базового, это может привести к чрезмерному распространению и снова сделать ваш код незаменимым.
  • Возможно, это приводит не к принципу «единой ответственности».

Для этого, я хотел бы предложить вам использовать:

  • контроллер плагин для Zend 2
  • помощников действий для Zend 1
1

Я хотел бы предложить создание CookieService с общедоступным методом createCookie внутри этой службы. Затем вы можете ввести эту службу внутри своего класса контроллера и вызвать этот метод внутри своего действия, не загрязняя класс контроллера дополнительной логикой, связанной с файлами cookie.

protected $translator; 
protected $cookieService; 

public function __construct($translator, CookieService $cookie) 
{ 
    $this->translator = $translator; 
    $this->cookieService = $cookieService; 
} 

public function changeLanguageAction() 
{ 
    $language = $this->params()->fromRoute('lang', 'en'); 
    $this->cookieService->createCookie('xuage', $language, '/'); 
    $this->redirect()->toRoute('home'); 
} 

Добавление файла cookie в ответ может быть выполнено внутри этой службы. Так эта линия будет решена внутри CookieService:

$this->getResponse()->getHeaders()->addHeader($this->cookie); 
1

Я отчасти согласен с Jannes Botis, но я бы немного более гибким ...

Если посмотреть на один из Matthew's last blog post (раздел Using zend-soap within a zend-mvc application), вы можете видеть, что он использует частную функцию (populateServer), которая имеет только причину в контексте обоих вышеперечисленных действий.

Я могу видеть, что вы использовали zend-framework3, поэтому я бы рекомендовал использовать стек PSR7 middleware для отправки вашего запроса и создания файлов cookie в «следующем» промежуточном программном обеспечении. На сегодняшний день я не уверен, что стек поддерживается в маршрутах, поэтому вам, вероятно, потребуется передать вызываемый через ваш конструктор вызов и вызвать его, если он существует.

final class MyAction() 
{ 
    private $next; 

    public function __construct(callable $next = null) 
    { 
     $this->next = $next; 
    } 

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null) : ResponseInterface 
    { 
     // your business code 
     if ($this->next) { 
      $call = $this->next; 
      $call($request, $response); 
     } 
     if ($next) { 
      $next($request, $response); 
     } 
     return $response; 
    } 
} 

Дайте нам знать, как это происходит, если вы идете по этому пути :)