4

この種の URL を「カバー」するルートを作成しようとしています。

www.test.com/parent1/parent2/parent3/item

www.test.com/parent1/parent2/parent3/parent4/item1

これらの親の数は未指定であり、サイトの URL をより直感的に見やすくするためにのみ使用する必要があります。主なパラメータはその「アイテム」です。

これを解決する唯一の方法は Route_Regex を使用することだと思うので、次のような方法でこのルート タスクを達成しようとしました。

routes.test.type = "Zend_Controller_Router_Route_Regex"
routes.test.route = "test/(?:.*)?([^\/]+)"
routes.test.defaults.module = default
routes.test.defaults.controller = test
routes.test.defaults.action = index
routes.test.map.1 = "path"
routes.test.map.2 = "item"
routes.test.reverse = "test/%s%s"

正しいことをしているかどうかわからないので、これをあまりテストしていません...その正規表現がどのように見えるべきか、その「パス」をどのように扱うべきかわかりません。

この種のルートの需要を満たすにはどうすればよいかアドバイスしてもらえますか? したがって、そのパス (parent1、parent2 など) は外観のみに必要であり、主なパラメーターはその「アイテム」です...

4

3 に答える 3

6

これは古い質問であることは知っていますが、同様の問題があり、解決策を投稿する必要があると思いました。他の人がこの質問を見るのに役立つかもしれません。

私はルートをプラグインに書きました。明らかに、これを機能させるにはプラグインをブートストラップに追加する必要があります;)

class Plugin_RoutesPage extends Zend_Controller_Plugin_Abstract
{
    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        $front_controller = Zend_Controller_Front::getInstance();
        $router = $front_controller->getRouter();

        // Page SEO friendly hierarchical urls
        $routePageSeoTree = new Zend_Controller_Router_Route_Regex(
            '([-a-zA-Z0-9/]+)/([-a-zA-Z0-9]+)',
            array(
                // default Route Values
                'controller' => 'page',
                'action' => 'open',
            ),
            array(
                // regex matched set names
                1 => 'parents',
                2 => 'item'
            )
        );
        $router->addRoute('page-seo-tree',$routePageSeoTree);

        // only one level
        $routeSinglePage = new Zend_Controller_Router_Route_Regex(
            '([-a-zA-Z0-9]+)',
            array(
                // default Route Values
                'controller' => 'page',
                'action' => 'open',
            ),
            array(
                // regex matched set names
                1 => 'item'
           )
        );
        $router->addRoute('page-single',$routeSinglePage);
    }
}

これは、コントローラーのアクションで使用する方法です

class PageController extends Zend_Controller_Action
{
    public function openAction()
    {
        // the part of the uri that you are interested in 
        $item = $this->_request->getParam('item');
    }
}

これをブートストラップに含める方法の簡単な例を次に示します

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initPlugins()
    {
            $front_controller = Zend_Controller_Front::getInstance();

            $front_controller->registerPlugin(new Plugin_RoutesPage(), 1);
    }
}

表示/開こうとしている現在のページには親がない可能性があるため、2 つのルートを使用する必要がありました。おそらく正規表現を書くためのより良い方法があると確信していますが、これが私にとってはうまくいきました。誰かが正規表現を改善する方法を知っているなら、私に知らせてください。

于 2012-03-22T16:50:31.940 に答える
1

親アイテムがまったく重要でない場合、単純な解決策は、Zend に到達する前にそれらを削除することです。test/:item

たとえば、次を使用します。

RewriteEngine On
RewriteRule ^(test/).*/([^/]+) $1$2  [L]

(「test/」の部分は、必要に応じて変更したり、動的にすることができます。)

これは、サイトの Apache の構成ファイル、または共有ホスティングの .htaccess ファイルに入ります。

Apache を使用していない場合は、使用している Web サーバーの URL 書き換え機能を確認してください。構文は多少異なる場合がありますが、類似しています。

于 2013-03-07T12:43:00.060 に答える
-2

zendルートが何であるか(phpに関連するものはありますか?)はわかりませんが、通常のプログラミング関数を使用できる場合、正規表現よりもはるかに簡単な解決策は、組み込みのリスト/分割関数を使用することです。

end(explode($Url,'/'))

Url.split('/').last()

ListLast(Url,'/')


正規表現が必要な場合は、次の方法で簡単に行うことができます。

[^/]+$

これにより、最後のスラッシュから行末までのすべてが得られます。
(エスケープが/必要なコンテキストで使用している場合は、バックスラッシュを使用してエスケープする必要があります。)


(ところで、あなたの例では、あなたは最初に持っていますtest/-それは意図的/必須ですか?)

于 2009-10-31T20:33:19.037 に答える