PRG BestPractice Zf2

时间:2014-09-27 22:54:09

标签: zend-framework2

我有一个最佳实践问题。

明确Post / Redirect / Get的作用,但处理它们的最佳实践是什么?

我认为有两种方法可以处理它们。

1。)我们首先在控制器操作上调用prg插件 2.)我们首先验证帖子数据,如果成功,只会重定向到prg-response?

我的问题是,

1。)我们因为重定向而放大了响应时间,这是默认的,所以我认为不是最好的解决方案

2。)将通过每次验证表单

来创建开销

你的意思是这种情况下更好的解决方案吗?

问候

更新:

我的意思是,正常(标准)案例是这样的 - http://framework.zend.com/manual/2.0/en/modules/zend.mvc.plugins.html#the-post-redirect-get-plugin

$prg = $this->prg('url');
if ($prg instanceof Response) {
    return $prg;
} elseif ($prg === false) {
    return new ViewModel(array(...));
}

$form->setData($prg);

这意味着,每个表单提交重定向后都会执行。 现在,我的想法是这样的:

$prg  = $this->prg();
$form = $this->getFormLogin();

$data = ($prg instanceof ResponseInterface)
           ? $this->getRequest()->getPost()
           : $prg;

if (false !== $data) {
    $form->setData($data);
    if (true === $form->isValid()) {
        if ($prg instanceOf ResponseInterface) {
            return $prg;
        }

    // Make something within the loginservice or something else
}

这背后的想法是,仅在表单有效时才重定向PRG,以节省响应时间和其他事情(因为引导设置等)。

1 个答案:

答案 0 :(得分:0)

Zend Framework基于Front-Controller模式设计,因此在访问不同资源(控制器操作)时重定向页面非常重要。

此外,当您从源代码中激活重定向(URL)函数时,您比较从浏览器访问相同(URL)的时间所需的时间最短。

使用classmap_autoloading时,可以将响应时间缩短到相当大的数量。

更新:

作为一个例子,我采取登录过程,在下面的代码中,我在同一个action()中实现了HTTP get和post方法,但是,你可以根据HTTP方法重构这个函数。

LoginController.php

public function loginAction()
{
  //code
  if ($request->isPost()) {
     //code
    if ($isValid) {
       return $this->redirect()->toUrl('urUrl');
    }
    return $this->redirect()->toUrl('urUrl');
  }
  //code
  return $viewModel;
}

重构上面的代码后

 //it used for HTTP get
    public function loginAction()
    {      
      //code
       return $viewModel;
    }

    //it used for HTTP POST
    public function loginPostAction()
    {      
        //code
        if ($notValid) {
           return $this->redirect()->toUrl('urUrl');
        }
       $viewModel->setTemplate($viewpath);
       return $viewModel;
    }

您需要修改路由配置,以便处理HTTP get和post方法。如果请求是HTTP-get,则控制器处理loginAction(),但如果其HTTP-post则处理loginPostAction()

Zend framework 2 - HTTP method Routing

<强>更新 插件的目的是避免用户再次将数据POST到浏览器。在您的情况下,您尝试启用选项以在表单无效(you are trying to change the behaviour of PRG plugin)时POST其数据。如果你真的担心响应时间,请不要使用PRG插件。在控制器动作中创建自定义逻辑。

- SJ