:
routes.test.route = "/:article"
routes.test.defaults.module = default
routes.test.defaults.controller = test
routes.test.defaults.action = test
routes.test.defaults.article = ""
あなたは$this->_getParam("article")
を使用して、コントローラにarticle
パラメータを取得することができます。残りの部分(記事の名前でデータベースエントリに一致)があなたの一部です。
ただし、url-prefixやarticle idのようなものを追加する必要があります。そうしないと、他のルートが見つからないことがあります。したがって、このようなものを使用することははるかに優れています:
routes.test.route = "/article/:id/:title"
routes.test.defaults.module = default
routes.test.defaults.controller = test
routes.test.defaults.action = test
routes.test.defaults.article = ""
routes.test.defaults.id = ""
あなたがリンクを作成するには、この方法のurl-なViewHelperを使用することができます。
<a href="<?php echo $this->url(array("id" => $article->id, "title" => $article->title), "test"); ?>"><?php echo $this->escape($article->title); ?></a>
、リダイレクトのためのあなたのコントローラで:
$this->_helper->redirector->gotoRoute(array("id" => $article->id, "title" => $article->title), "test");
を
無効な文字(またはASCII以外の文字)の場合は、$article->title
をエスケープまたはフィルタリングしてください。
ありがとうございますが、SEOの観点から見ると、1レベルの深度は3よりも優れています。したがって、URLのプレフィックスを使用しても問題は解決しません。 このシナリオを想定してみましょう:すべてのリクエストがアーティクルコントローラにリダイレクトされます。指定されたURIを持つアーティクルが見つからない場合は、リクエストを再度ルーティングするためにルータにリクエストをリダイレクトします。 – Maverick
このルートをroutes.iniの最初のエントリ(またはリソースとして使用している場合はapplication.ini)にすると、ZFディスパッチャは引き続き他のルートを探します。最良の場合は、すべての記事を今すぐ一致させます(そうでない場合は、404 httpコードを送信します)。それでもディスパッチャをもう一度呼び出す場合は、$ this - > _ request-> setDispatched(false) 'を実行するか、別のアクションをスタックに追加してください:' $ this - > _ helper-> actionStack( "action" "コントローラ"、 "モジュール"); ' – MonkeyMonkey
ありがとう...これを試して、一度確認したら回答を受け入れる – Maverick