我有一个最佳实践问题。
明确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,以节省响应时间和其他事情(因为引导设置等)。
答案 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