Cakephp内部从控制器重定向到另一个控制器

时间:2010-11-20 15:14:30

标签: cakephp redirect controller routes internal

更新:我写了一些关于在php中使用header的错误陈述;所以忘记那部分:)

我想要的是从另一个控制器获取并显示控制器的视图(带有控制器的数据),而不需要在浏览器中更改URL。

一些细节:

  1. 重定向不起作用,因为是直接重定向(通过浏览器)
  2. requestAction不允许我正确获取css和图像
  3. 我需要这个东西,因为我有一个控制器调度程序,可以在内部重定向到其他控制器。

    我认为唯一(正确的)解决方案是在/ config中使用routes.php和Router :: connect 并使用调度程序控制器中的逻辑。

2 个答案:

答案 0 :(得分:14)

ummm ... header()是用于重定向的函数,除非PHP文档错误。 (http://php.net/manual/en/function.header.php)cakePHP中的核心使用头部作为重定向功能(参见cake / libs / controller.php的第721-730行)。

所以我不确定你的意思“像普通的PHP”。 CakePHP是PHP,它只是建立在面向对象的代码上。这不是魔术或扭曲的做事方式。因此,要在蛋糕中进行重定向,您只需使用:

$this->redirect(array('controller' => 'my_controller', 'action' => 'my_action'));

它将调用header()函数。

现在。如果您设置为不使用重定向(可能是您要访问外部站点),则可以在代码中调用header()。只要确保你把exit();标题调用后:

header('Location: http://call/my/url');
exit();

它的工作方式与重定向相同。这只是很多不必要的额外工作。请记住,使用重定向将维护域名并自动为您构建URL。

答案 1 :(得分:2)

通常,将URL连接到控制器是路由的工作。如果你的逻辑相当复杂并且普通路由不会削减它,你甚至可以编写自己的路由解析器类来执行更复杂的逻辑(这些都在手册中)。

如果此路由逻辑涉及数据库查询或任何其他类型的控制器逻辑,并且可能导致基于某个内部状态的相同URL的输出非常不同,那么您正在创建一个非常RESTless的应用程序而且我提交你应该重新考虑你想要做的事情。话虽如此,您可以使用$this->render()从任何控制器操作渲染任何视图。每个视图的控制器逻辑可以放在AppController中,也可以(部分)放在要从任何地方调用的模型中。因此,路由不是“重定向”到不同的控制器,而是像往常一样路由到特定的控制器动作,该动作动态调用它需要调用的代码,然后呈现它需要呈现的视图。

如果您希望自己的应用保持相同的网址但显示的内容非常不同,那么您应该考虑制作一个AJAX应用。

适合您的解决方案可能介于两者之间。