2010-11-20 143 views
4

更新:我寫了一些關於在PHP中使用標題的錯誤陳述;所以忘記那部分:)Cakephp內部重定向從控制器到另一個控制器

我想要的是從另一個控制器獲取並顯示控制器的視圖(與控制器的數據),而無需在瀏覽器中更改URL。

一些細節:因爲是直接重定向(通過瀏覽器)

  • requestAction不允許我去取CSS和圖像正確
    1. 重定向不會做的工作我需要這個東西,因爲我有一個內部重定向到其他控制器的控制器分派器。

      我認爲唯一的(正確的)解決方案是在路由器:: connect 的/ config中使用routes.php,並使用調度器控制器中的邏輯。

    +1

    「內部重寫」通常通過路由完成。你的「控制器調度員」有什麼特別之處,你不能用路由做同樣的事情? – deceze 2010-11-21 00:29:02

    +0

    正如你所說,解決方案是做數據庫和路由之間的交互......但我不知道是否有可能 – apelliciari 2010-11-21 10:29:36

    +0

    你想從另一個模型中的控制器動作顯示一個模型的數據? – Nigel 2010-11-21 10:45:53

    回答

    12

    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(); 
    

    它的工作原理與重定向一樣。這只是很多不必要的額外工作。請記住,使用重定向會自動維護域名併爲您構建網址。

    +0

    是的,你是對的我混淆了標題的使用。 我正在儘快修復這個問題。 我需要一些像htaccess url重定向(及其透明度) – apelliciari 2010-11-20 16:22:07

    +0

    FYI你可以使用頭也轉到相對路徑 – apelliciari 2010-11-21 10:28:05

    2

    通常,將URL連接到控制器是路由的工作。如果你的邏輯非常複雜,並且正常的路由不會削減它,你甚至可以編寫自己的路由解析器類,它可以執行更復雜的邏輯(這些都在手冊中)。

    如果這個路由邏輯涉及數據庫查詢或任何其他類型的控制器邏輯,並可能導致基於某些內部狀態的相同URL的輸出會非常不同,但是您正在製作一個非常有用的RESTless應用程序,我會提交給您應該重新考慮你想要做的事情。話雖如此,您可以使用$this->render()來呈現任何控制器操作的任何視圖。每個視圖的控制器邏輯可以放在AppController中,或者可能(部分)放置在從任何地方被調用的模型中。因此,與其「重定向到」不同的控制器,路由只是路由到特定的控制器操作,該操作動態調用它需要調用的代碼,然後呈現它需要呈現的視圖。

    如果你希望你的應用保持在同一個URL上,但顯示的內容非常不同,你應該也可以考慮製作一個AJAX應用。

    適合您的正確解決方案可能介於兩者之間。

    相關問題