Zend Framework函数不是控制器中的动作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}
答案
我建议在这项服务中使用公共方法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);
另一答案
我有点赞同Jannes Botis,但我会更灵活......
如果你看一个Matthew's last blog post(Using zend-soap within a zend-mvc application
部分),你可以看到他使用了一个私有函数(populateServer
),它在上述两个动作的上下文中只有一个原因。
我可以看到你使用了zend-framework3
,所以我真正推荐的是使用PSR7 middleware堆栈来发送你的请求并在“下一个”中间件中生成cookie。截至今天,我不确定路由中是否支持堆栈,因此您可能需要通过构造函数传递一个callable并在它存在时调用它。
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;
}
}
如果你沿着这条路走下去,请告诉我们怎么回事:)
另一答案
在我看来,由于以下事实,这可能导致您的代码更难维护:
- 您不能在不同的控制器之间共享“createCookie”功能,并将功能复制到不同的控制器。
- 即使您将控制器扩展到基础控制器,也可能导致过度扩展并再次使您的代码无法维护。
- 也许这不遵循“Single responsibility principle”。
为此,我建议你使用:
- controller plugins为Zend 2
- action helpers为Zend 1
以上是关于Zend Framework函数不是控制器中的动作的主要内容,如果未能解决你的问题,请参考以下文章
PHP Zend Framework:获取控制器中的引导资源