1

私は PagesController (Cake に組み込まれているものとは異なります) を使用しており、新しいルートを接続したいと考えています。

Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

他のすべての (デフォルト) ルートが失敗した場合にのみ、Cake がこのルートを使用することを本当に望んでいます。ただし、ルートだけでは機能しないようです。カスタムの CakeRoute クラスを使用する必要があるという予感がありますが、やりたいことを実行する方法がまったくわかりません。

誰かがこれを手伝ってくれませんか?

[編集] ああ、私が CakePHP 2.2.0 を使用していることを知っておくと役に立つかもしれません

[2回目の編集] リクエストに応じて、もう少し情報を追加します。現在、ルーターは次のようになっています。

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

/home/about にアクセスすると、「エラー: HomeController が見つかりませんでした」というメッセージが表示されます。私もこれを試しました:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));
require CAKE . 'Config' . DS . 'routes.php';

しかし、すべてが私のページコントローラーにルーティングされ、私はそれを望んでいません。他のすべてのルートが失敗した場合にのみ、そのルートを使用したいと考えています。

繰り返しますが、これはカスタム CakeRoute クラスでのみ実行できるという予感がありますが、正確な方法はわかりません。

4

2 に答える 2

1

これが古い投稿であることは承知していますが、Cake でのキャッチオール ルーティングに苦労している人のために、スキニーを以下に示します。

/* などのキャッチオール ルートを作成すると、その定義が URL 内のあらゆるものを取得できるようになります。言い換えれば、それは非常に貪欲です。私の知る限り、この種の定義を条件付きで有効にする方法はありません。これは、/* が定義される前に URL がどのルート定義とも一致しない場合、/* 定義がそれを取得することを意味します。したがって、もちろん、私たちがすでに知っているキャッチオールルートを常に最後に定義してください:-)

ここで、Cake が「正常に」動作し続けることを保証するために (つまり、/posts/view/4 などの URL が PostsController::view($id = 4) にルーティングされることを意味します)、実際にはそれを明示的に定義する必要があります。 /* 定義の前のルート ファイル。はい、Cake でキャッチオール ルートを使用している場合は、標準の Cake ルーティング規則を利用するために、その前にすべての Controller::method() ルートを明示的に定義する必要があります。

これは難しそうに聞こえるかもしれませんが、routes.php ですべてのルート定義をアルファベット順に並べれば、それほど悪くはありません。プロジェクトの /Controller ディレクトリを見て、同じ順序で並べてください。また、複数のルート定義が必要なものもあるため、各コントローラー グループの上にコメントを実装します。これは、私の routes.php ファイルの 1 つから抽出された例です。

/**
 * CaseStudiesController
 */
Router::connect('/case-studies', array('controller' => 'case_studies', 'action' => 'index'));
Router::connect('/case-studies/:action', array('controller' => 'case_studies'));
Router::connect('/case-studies/:action/*', array('controller' => 'case_studies'));
Router::connect('/case-studies/*', array('controller' => 'case_studies', 'action' => 'index'));

/**
 * PostsController
 */
Router::connect('/posts', array('controller' => 'posts', 'action' => 'index'));
Router::connect('/posts/:action', array('controller' => 'posts'));
Router::connect('/posts/:action/*', array('controller' => 'posts'));
Router::connect('/posts/*', array('controller' => 'posts', 'action' => 'index'));

一般的に言えば、Controller ごとに必要なルート定義は 4 つだけです。最後に、私の場合の routes.php の下端は次のとおりです。

/**
 * UrlAliasesController
 *
 * This catch-all route is very greedy and even grabs the default CakePHP /:controller/:action URL format
 * Above this line, all public controller methods must be accounted for in specific routes
 */
Router::connect('/*', array('controller' => 'url_aliases', 'action' => 'check', 'admin' => false));

/**
 * Load all plugin routes. See the CakePlugin documentation on
 * how to customize the loading of plugin routes.
 */
CakePlugin::routes();

/**
 * Load the CakePHP default routes. Only remove this if you do not want to use
 * the built-in default routes.
 */
require CAKE . 'Config' . DS . 'routes.php';
于 2015-06-04T23:54:41.133 に答える
1

一般的なルートを最後に行の前に置くようにしてくださいCakePlugin::routes();。このようなもの:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
//all your routes
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';

お役に立てれば

EDITED:私は同じ原則を持つウェブサイトを持っています..そして私はこのルートを使いました

Router::connect('/:slug', array('controller' => 'users', 'action' => 'view'),array('pass'=>array('slug'),'slug'=>"[a-z0-9\-]+"));

最後に(前にCakePlugin::routes())、私にとってはうまくいきます。

于 2012-07-13T16:00:16.050 に答える