4

在不是動作的控制器中創建函數是不好的做法嗎?不是控制器中的動作的Zend Framework函數

例如:在下面的控制器

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功能,這可能會導致使您的代碼更加難以維持,由於這樣的事實:

  • 您不能共享不同控制器之間的「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

我有種與雅尼布提斯同意,但我會是一個更靈活一點......

如果你看看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; 
    } 
} 

讓我們知道如何去,如果你沿着這條路走下去:)

相關問題