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 postUsing 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”。

为此,我建议你使用:

以上是关于Zend Framework函数不是控制器中的动作的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework - 改变动作输出的顺序

PHP Zend Framework:获取控制器中的引导资源

Zend Framework 和 Doctrine 2 - 我的单元测试是不是足够?

Zend Framework 中的动态菜单

Zend Framework 2-从控制器返回JSON

设置 zend 框架动作控制器