4

更新:phpでのヘッダーの使用について間違ったステートメントをいくつか書きました。だからその部分を忘れてください:)

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

いくつかの詳細:

  1. 直接リダイレクト(ブラウザ経由)であるため、リダイレクトは機能しません
  2. requestActionでは、CSSと画像を正しくフェッチできません

内部で他のコントローラーにリダイレクトするコントローラーディスパッチャーがあるので、これが必要です。

唯一の(正しい)解決策は、Router ::connectで/configのroutes.phpを使用し、ディスパッチャーコントローラーにあったロジックを使用することだと思います。

4

2 に答える 2

16

うーん... 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 が自動的に作成されることに注意してください。

于 2010-11-20T15:30:43.133 に答える
2

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

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

アプリを同じ URL にとどめて、まったく異なるコンテンツを表示したい場合は、おそらく AJAX アプリの作成も検討する必要があります。

あなたにとって適切な解決策は、おそらくその中間にあるでしょう。

于 2010-11-21T12:14:01.503 に答える