Phalcon重定向和转发

Ian*_*hek 14 phalcon

我是否理解正确,$this->dispatcher->forward()或者$this->response->redirect()我需要手动确保其余代码不会被执行?如下,或者我错过了什么?

public function signinAction()
{
    if ($this->isUserAuthenticated())
    {
        $this->response->redirect('/profile');
        return;
    }

    // Stuff if he isn't authenticated…
}
Run Code Online (Sandbox Code Playgroud)

Ian*_*hek 27

在使用Phalcon超出其能力的核心项目工作近一年之后,我想澄清一些事情并回答我自己的问题.要了解如何正确地执行重定向和转发,您需要了解Dispatcher :: dispatch方法的工作原理.

看一下这里的代码,虽然它对我们大多数人来说都是C mumbo-jumbo,它的写得非常好并且有文档记录.简而言之,这就是它的作用:

  1. 调度程序进入 while循环,直到_finished属性变为true发现递归.
  2. 在循环内部,它会立即将该属性设置true,因此当它开始下一次迭代时,它将自动中断.
  3. 然后它获取控制器/操作信息,这些信息最初由应用程序中的路由器提供,并进行各种检查.在此之前和之后,它还完成了许多与事件相关的业务.
  4. 最后,它要求在控制器的操作方法和更新_returnedValue财产(你猜怎么着!)返回的值.
  5. 如果操作过程中打电话给你调用Dispatcher::forward方法,它将更新_finished财产退还false,这将使该while循环从该名单中的第2步继续.

因此,在进行重定向或转发之后,您需要确保只有当代码是预期逻辑的一部分时才会执行代码.换句话说,您不必返回return $this->response->redirect或的结果return $this->dispatcher->forward.

做最后一件事似乎很方便,但不是很正确,可能会导致问题.在99.9%的情况下,你的控制器不应该返回任何东西.例外情况是您实际知道自己在做什么,并希望通过返回响应对象来更改应用程序中呈现过程的行为.最重要的是,您的IDE可能会抱怨返回语句不一致.

要完成,从控制器内重定向的正确方法:

// Calling redirect only sets the 30X response status. You also should
// disable the view to prevent the unnecessary rendering.

$this->response->redirect('/profile');
$this->view->disable();

// If you are in the middle of something, you probably don't want 
// the rest of the code running.

return; 
Run Code Online (Sandbox Code Playgroud)

并转发:

$this->dispatcher->forward(['action' => 'profile']);

// Again, exit if you don't need the rest of the logic.

return;
Run Code Online (Sandbox Code Playgroud)

  • 在大多数情况下,是的,在某些情况下没有,例如,当在其之外的行动之后运行某些逻辑并且大多数框架(包括Phalcon)确实具有该逻辑时.在Phalcon案例中,从[here](https://github.com/phalcon/cphalcon/blob/8aba8584d54237af9f2c0e5eba3dcc8a950cd225/ext/dispatcher.c#L964)上可以看到最后一次操作后会发生什么,尽管在大多数情况下都没有如果你"死",就不会扮演任何角色.`die`是一种完成请求的hacky方式,有一些意见围绕为什么使用它是一种不好的做法,特别是在处理该请求的框架内使用它时. (2认同)

小智 10

你需要像这样使用它:

return $this->response->redirect('/profile');
Run Code Online (Sandbox Code Playgroud)

要么

return $this->dispatcher->forward(array(
    'action' => 'profile'
))
Run Code Online (Sandbox Code Playgroud)