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

Posted

技术标签:

【中文标题】Cakephp 内部从控制器重定向到另一个控制器【英文标题】:Cakephp internal redirect from controller to another controller 【发布时间】:2011-05-13 02:45:38 【问题描述】:

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

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

一些细节:

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

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

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

【问题讨论】:

“内部重写”通常使用 Routes 完成。您的“控制器调度程序”有什么特别之处,以至于您无法使用路由做同样的事情? 如你所说,解决方案是在数据库和路由之间进行交互......但我不知道是否可能 您希望一个模型的数据显示在另一个模型的控制器操作中? @apelliciari 我有同样的问题,但如果我使用 header() 函数,它会更改浏览器中的网址。我需要什么:myapp.com/Basketball url 应该加载与 myapp.com/sports/display/basketball 相同的页面内容。如果我尝试标题,它将加载篮球相关内容,但 url 也会在浏览器中更改。有什么建议吗? 我想你需要setAction() 方法 【参考方案1】:

ummm... 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。

【讨论】:

是的,你是对的,我混淆了标题的使用。我正在尽快修改这个问题。我需要一些类似 htaccess url 重定向(及其透明度) 仅供参考,您也可以使用标头转到相对路径【参考方案2】:

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

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

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

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

【讨论】:

以上是关于Cakephp 内部从控制器重定向到另一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 segue 从一个视图控制器重定向到另一个视图控制器

Nest.Js 从一个控制器重定向到另一个

Ionic Framework:无法从我的控制器重定向到另一个页面?

如何使用命名 URL 映射从控制器重定向?

如何在 IOS 应用程序中从视图控制器重定向回主故事板

从基本控制器重定向到操作方法