1

私はCakephp 2+を使用しており、「投稿」と呼ばれるモデルがあり、投稿はさまざまなタイプにすることができます-たとえば、ブログ投稿、メッセージなど.

config/routes.phpで、ルーティングを設定して、/posts/12/post-titleまたは/blog/14/blog-title

現時点で私はこれを持っています:

Router::connect('/:type/add', array('controller' => 'posts', 'action' => 'add'),
    array('pass' => array('type')));

Router::connect('/:type/:action', array('controller' => 'posts'),
    array('pass' => array('type')));

# Custom posts router
Router::connect('/:type/:id/:slug', 
array('controller' => 'posts', 'action' => 'view'),
    array('pass' => array('type', 'id', 'slug'), 'id' => '[0-9]+'));

しかし、問題は、これがすべての URL に使用されることです。そのため、cakephp は、ユーザー プロファイル ページが投稿コントローラーを参照する必要があると判断します。

...

#View Profile
Router::connect('/profile/:id', array('controller' => 'users', 'action' => 'view'),
    array('pass' => array('id'), 'id' => '[0-9]+'));

これを適切に行う手段を知っている人はいますか?どうもありがとう

4

1 に答える 1

1

まず、ルートの順序が重要です。複数のルートが URL に一致する場合、最初に一致したルートが処理されます。

次に、「id」の場合と同様に、Router::connect() の最後の引数の「type」キーに正規表現を設定することで、「何」を「type」と見なすかを制限できます。正規表現にすべての有効なタイプを含めるか、値を除外する「負の」部分を正規表現に追加することができますたとえば、コントローラ名

このようなもの:

Router::connect(
    '/:type/:action',
    array(
         'controller'  => 'posts',
    ),
    array(
         /**
          * Custom type:
              * only allow 'post', 'blog' or 'message' as type here
              * to prevent overlapping with 'controllers'
          */
         'type'   => '(post|blog|message)',

         // Define what should be passed to the 'view' action as arguments
         'pass'   => array('type'),

         /**
          * Optionally, define what parameters should be automatically preserved
          * when creating URLs/links
          */
         'persist' => array('type'),
    )
);

Router::connect(
    '/:type/:id/:slug',
    array(
         'controller'  => 'posts',
         'action'      => 'view',
    ),
    array(
         /**
          * Custom type:
              * only allow 'post', 'blog' or 'message' as type here
              * to prevent overlapping with 'controllers'
          */
         'type'   => '(post|blog|message)',
         'id'     => '[0-9]+',

         // Define what should be passed to the 'view' action as arguments
         'pass'         => array('type', 'id', 'slug'),

         /**
          * Optionally, define what parameters should be automatically preserved
          * when creating URLs/links
          */
         'persist' => array('type'),
    )
);
于 2013-02-03T10:52:22.113 に答える