CakePHP использовать захват переменных Regex в маршрутах? - PullRequest
2 голосов
/ 11 февраля 2011

В моем приложении CakePHP у меня есть статические страницы, настроенные так:

Router::connect(
    '/terms', 
    array('controller' => 'pages', 'action' => 'display', 'terms')
);

Это перезапишет /terms в /pages/display/terms, чтобы сделать более привлекательные короткие URL.

Теперь, если бы я хотел сделать это для всех моих статических страниц, это было бы довольно избыточно:

Router::connect(
    '/terms', 
    array('controller' => 'pages', 'action' => 'display', 'terms')
);
Router::connect(
    '/privacy', 
    array('controller' => 'pages', 'action' => 'display', 'privacy')
);
Router::connect(
    '/about', 
    array('controller' => 'pages', 'action' => 'display', 'about')
);

С обычным mod_rewrite вы можете сделать что-то вроде этого:

/(terms|privacy|about) /pages/display/$1

Итак, я, естественно, попытался это сделать:

Router::connect(
    '/(terms|privacy|about)', 
    array('controller' => 'pages', 'action' => 'display', '$1')
);

Это не работает. Есть ли такая поддержка, если да, то как ты это делаешь?

1 Ответ

3 голосов
/ 11 февраля 2011

Сверху моей головы, это может решить проблему.Чтобы выполнить сопоставление с регулярным выражением для части, вы должны сделать это следующим образом:

Router::connect(
    '/:page',
    array(
        'controller' => 'pages',
        'action' => 'display',
    ),
    array(
        'page' => '(terms|privacy|about)',
        'pass' => array('page')
    )
);

Обратите внимание, как заполнитель page в URL экстраполируется на третий параметр, массив.Там мы говорим, что оно должно соответствовать указанному регулярному выражению.Также следует отметить, что в нем также говорится о том, чтобы передать заполнитель page в метод action.Таким образом, он знает, какую страницу отображать.

...