2012-04-29 3 views
1

私はzendフレームワークを使ってhttp://mysite.com/ArticleTitleHereのような私のサイトのURLをどうやって実装するのだろうと思っていました。Zend routes&SEO

私はそれが正規表現のルートを実装する方法ですが、この方法では、通常のmodule/controller/actionまたはcontroller/actionルートから記事のURLを伝えることができません。そのようなことをどうやって実行するのですか?あなたのルートで、そのためにプレースホルダを使用することができます

おかげ

答えて

3

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をエスケープまたはフィルタリングしてください。

+0

ありがとうございますが、SEOの観点から見ると、1レベルの深度は3よりも優れています。したがって、URLのプレフィックスを使用しても問題は解決しません。 このシナリオを想定してみましょう:すべてのリクエストがアーティクルコントローラにリダイレクトされます。指定されたURIを持つアーティクルが見つからない場合は、リクエストを再度ルーティングするためにルータにリクエストをリダイレクトします。 – Maverick

+0

このルートをroutes.iniの最初のエントリ(またはリソースとして使用している場合はapplication.ini)にすると、ZFディスパッチャは引き続き他のルートを探します。最良の場合は、すべての記事を今すぐ一致させます(そうでない場合は、404 httpコードを送信します)。それでもディスパッチャをもう一度呼び出す場合は、$ this - > _ request-> setDispatched(false) 'を実行するか、別のアクションをスタックに追加してください:' $ this - > _ helper-> actionStack( "action" "コントローラ"、 "モジュール"); ' – MonkeyMonkey

+0

ありがとう...これを試して、一度確認したら回答を受け入れる – Maverick