Phalcon 重定向和转发

Posted

技术标签:

【中文标题】Phalcon 重定向和转发【英文标题】:Phalcon redirection and forwarding 【发布时间】:2014-02-13 14:44:50 【问题描述】:

我是否正确理解在执行$this->dispatcher->forward()$this->response->redirect() 之后我需要手动确保其余代码不会被执行?像下面这样,还是我错过了什么?

public function signinAction()

    if ($this->isUserAuthenticated())
    
        $this->response->redirect('/profile');
        return;
    

    // Stuff if he isn't authenticated…

【问题讨论】:

【参考方案1】:

你需要像这样使用它:

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

return $this->dispatcher->forward(array(
    'action' => 'profile'
))

【讨论】:

如何在不使用 echo 的情况下从转发的控制器/动作中获取内容?【参考方案2】:

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

看看代码here,虽然对我们大多数人来说都是 C 语言,但它的编写和文档都非常好。简而言之,这就是它的作用:

    调度程序enters while 循环直到_finished 属性变为true 或discovers 递归。 在循环内部,它立即将sets该属性设置为true,因此当它开始下一次迭代时,它将自动break。 然后它会获取最初由路由器在应用程序中提供的控制器/操作信息,并进行各种检查。前后还完成了很多与活动相关的业务。 最后是calls 控制器中的操作方法和updates 带有(猜猜看!)返回值的_returnedValue 属性。 如果在操作调用期间调用Dispatcher::forward 方法,它会将update 的_finished 属性返回到false,这将允许while 循环从该列表的第2 步继续。

因此,在您进行重定向或转发之后,您需要确保您的代码不会在符合预期逻辑的情况下执行。换句话说,您不必返回return $this->response->redirectreturn $this->dispatcher->forward 的结果。

做最后一个可能看起来很方便,但不是很正确,可能会导致问题。在 99.9% 的情况下,您的控制器不应返回任何内容。例外情况是当您真正知道自己在做什么并希望通过返回响应对象来change 应用程序中呈现过程的行为时。除此之外,您的 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; 

然后转发:

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

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

return;

【讨论】:

response->redirect() 之后,一个简单的die() 不够吗? (我的意思不是禁用视图并返回) 在大多数情况下是的,在某些情况下不是,例如,当有一些逻辑要在其外部的操作之后运行时,并且大多数框架,包括 Phalcon,都具有该逻辑。在 Phalcon 的情况下,从here 开始,您可以看到最后一个操作之后发生的情况,但在大多数情况下,如果您在其上使用die,这不会发挥任何作用。 die 是一种完成请求的笨方法,关于为什么使用它是一种不好的做法有一些意见,尤其是在处理该请求的框架中使用它时。【参考方案3】:

像这样使用 send()

public function signinAction()

    if ($this->isUserAuthenticated())
    
        return $this->response->redirect('profile')->send();
    

【讨论】:

这帮助我修复了它。我只使用了 response->redirect (预先使用 view->disable() ),但我的操作(应该受到登录保护)仍然被执行(即使显示了登录页面),添加了缺少的“发送()“让它工作。 谢谢!我已经分离了重定向功能,所以return 不起作用。您的解决方案帮助了我

以上是关于Phalcon 重定向和转发的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC框架如何实现请求转发和重定向呢?

java中转发和重定向的区别

请问重定向与请求转发有啥区别?

转发和重定向的区别

转发和重定向

转发和重定向的区别