4

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

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

一些细节:

  1. 重定向不起作用,因为它是直接重定向(通过浏览器)
  2. requestAction 不允许我正确获取 css 和图像

我需要这个东西,因为我有一个控制器调度程序,它在内部重定向到其他控制器。

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

4

2 回答 2

16

嗯... header() 是用于重定向的函数,除非 PHP 文档有误。(http://php.net/manual/en/function.header.php) cakePHP 的核心使用 header 来实现重定向功能(参见 cake/libs/controller.php 的第 721 - 730 行)。

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

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

它会调用 header() 函数。

现在。如果您不使用重定向(也许如果您要去外部站点),您可以在代码中调用 header()。只要确保你把 exit(); 在标头调用之后:

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

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

于 2010-11-20T15:30:43.133 回答
2

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

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

如果您希望您的应用程序保持在同一个 URL 上但显示非常不同的内容,您可能还应该考虑制作一个 AJAX 应用程序。

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

于 2010-11-21T12:14:01.503 回答