2010-11-20 10 views
4

更新:私はPHPのヘッダの使い方について間違った記述を書いた。その部分を忘れてください:)コントローラから別のコントローラへのCakephpの内部リダイレクト

私が欲しいのは、ブラウザでURLの変更をせずに、別のコントローラから(コントローラのデータで)コントローラのビューを取り出して表示することです。

いくつかの詳細:

  1. (ブラウザを介して)直接リダイレクトであるため、リダイレクトが仕事をしない
  2. がでrequestActionは私が正しく

CSSや画像を取得することはできません。私は他のコントローラに内部的にリダイレクトするコントローラディスパッチャを持っているので、このことが必要です。

ルーター::接続 で/ configにroutes.phpを使用し、ディスパッチャコントローラにあったロジックを使用しているというのは正しい解決策だと思います。

+1

"Internal rewriting"は通常Routeで実行されます。あなたの "コントローラディスパッチャー"について、ルートを使って同じことをすることができないことは何が特別でしょうか? – deceze

+0

あなたが言ったように、解決策はデータベースとルートの間のやりとりをすることです...しかし、私はそれが可能かどうかわかりません – apelliciari

+0

別のモデルのコントローラアクションに表示された1つのモデルのデータが必要ですか? – Nigel

答えて

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

リダイレクトと同じ機能です。それは単なる不必要な余分な仕事です。リダイレクトを使用するとドメイン名が維持され、自動的にURLが作成されます。

+0

はい、私はヘッダーの使用を混乱させました。 私はできるだけ早く質問を取り直しています。 私はhtaccessのURLリダイレクション(とその透過性)のようなものが必要です – apelliciari

+0

あなたは相対パスに行くためにヘッダを使うこともできます – apelliciari

2

一般に、URLをコントローラに接続することは、ルートの仕事です。あなたのロジックがかなり複雑で、通常のルートではそれをカットしない場合は、より複雑なロジックを行う独自のルートパーサークラスを作成することもできます(マニュアルのすべてです)。

このルーティングロジックにデータベースクエリやその他のコントローラロジックが含まれていて、何らかの内部状態に基づいて同じURLに対して非常に異なる出力が得られる場合は、非常にRESTlessアプリケーションを作成していますあなたがしようとしていることを再考する必要があります。以上のことから、$this->render()を使用して、任意のコントローラアクションから任意のビューをレンダリングできます。各ビューのコントローラロジックは、AppControllerに配置することも、どこからでも呼び出すことができる(一部)モデルにすることもできます。したがって、別のコントローラに「リダイレクト」するのではなく、ルートは特定のコントローラアクションに通常どおりルーティングされ、呼び出す必要のあるコードを動的に呼び出してレンダリングする必要があるビューをレンダリングします。

あなたのアプリが同じURLに留まっていても非常に異なるコンテンツを表示したい場合は、おそらくAJAXアプリケーションの作成に目を向けるべきでしょう。

あなたのための適切な解決策はおそらく間にあります。

関連する問題