【问题标题】:Cakephp internal redirect from controller to another controllerCakephp 内部从控制器重定向到另一个控制器
【发布时间】:2023-04-10 18:00:01
【问题描述】:

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

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

一些细节:

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

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

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

【问题讨论】:

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

标签: cakephp redirect controller routes internal


【解决方案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 应用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多