3

2つの変数を受け入れるようにコントローラーを設定しています。/clients/view/var1/var2

そして私はそれを/var1/var2

だから私は試しました

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

しかし、これにより、他のすべてのコントローラーがすべての/*ルートとして機能しなくなります

サイトにある他のすべてのページはadminプレフィックス内にあるため、基本的に、現在のプレフィックスがadmin!の場合は無視されるルートが必要です。私はこれを試しました(正規表現は単語を含まない行に一致する正規表現からのものですか?):

Router::connect('/:one', array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), array(
    'one' => '^((?!admin).*)$'
));

しかし、正規表現は正しくないと思います。これは、正規表現に移動する/testと、クライアントではなくテストコントローラーを要求するためです。

私の他の唯一のルートは次のとおりです。

Router::connect('/admin', array('admin'=>true, 'controller' => 'clients', 'action' => 'index'));
Router::connect('/', array('admin'=>false, 'controller' => 'users', 'action' => 'login'));

私は何が間違っているのですか?ありがとう。

4

2 に答える 2

3

私はあなたの質問を初めて誤解しました。コードをテストしましたが、期待した結果も得られませんでした。その理由は、正規表現パーサーが負の先読みアサーションをサポートしていないためである可能性があります。しかし、ルートを並べ替えることでこれを解決できると思います。

CakeBookには、プレフィックスルーティングを使用した場合に自動的に生成されるルートが記述されています。あなたの場合、これらのルートは、すべての管理アクションをキャッチするために、「/*」ルートの前に手動で割り当てる必要があります。これが私のために働いたコードです:

// the previously defined routes
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/admin', array('controller' => 'clients', 'action' => 'index', 'admin' => true));

// prefix routing default routes with admin prefix
Router::connect("/admin/:controller", array('action' => 'index', 'prefix' => 'admin', 'admin' => true));
Router::connect("/admin/:controller/:action/*", array('prefix' => 'admin', 'admin' => true));   

// the 'handle all the rest' route, without regex
Router::connect(
    '/*', 
    array('admin'=>false, 'controller' => 'clients', 'action' => 'view'), 
    array()
);

これで、管理プレフィックスが付いたすべての管理コントローラーアクションが取得され、/ test1/test2がクライアントコントローラーにリダイレクトされます。

于 2012-04-19T21:01:00.407 に答える
0

解決策は、ルーティングに関するパン屋の記事「アクションへのパラメーターの受け渡し」(コードはテストされていません)で説明されていると思います。

Router::connect(
    '/clients/view/:var1/:var2/*',  
    array( 
        'controller' => 'clients',
        'action' => 'view'
    ),
    array( 
        'pass' => array( 
            'var1', 
            'var2' 
        ) 
    ) 
);

コントローラのアクションは次のようになります。

public function view($var1 = null, $var2 = null) { 
    // do controller stuff
}

また、ルートの順序も確認しました(「ルートの順序は重要」のセクションを参照してください)。あなたの例では、「/ *」は最初に来る場合は他のすべてのルートを停止し、他のルートの後にルールを割り当てると、他のルートと一致しなかったリクエストのみを処理します。

于 2012-04-18T20:10:39.447 に答える