Сен 29 2008

Работаем с маршрутами в CakePHP (часть 3)

Раздел: МаршрутыМета @ 21:00

Дополнительную гибкость системе маршрутов придают специальные элементы. Эти элементы вы можете определять сами, с их помощью в URL-адресе отмечаются места, где будут находиться параметры, передаваемые в функции контроллера. При выполнении запроса, значения специальных элементов сохраняются в массиве $this->params. Обратите внимание на отличие специальных элементов маршрута от именованных: именованные (/controller/action/name:value) передаются в массиве $this->passedArgs.

При создании специального элемента для него надо обязательно указать регулярное выражение — с его помощью CakePHP будет проверять правильность URL-адреса.

1
2
3
4
5
Router::connect(
    '/:controller/:id',
    array('action' => 'view'),
    array('id' => '[0-9]+')
);

В этом примере показано, как вызывать функцию view() любого контроллера, просто указав в адресе его имя и id записи (ссылку вида /controller/id). В первом параметре вызова Router::connect() указывается два элемента маршрута: :controller — это элемент по-умолчанию, заменяемый на имя контроллера, :id — специальный элемент, определяемый регулярным выражением в третьем параметре ([0-9]+). В этом примере, если после имени контроллера идет любое количество цифр, то будет вызвана функция view(). При этом адреса /controller/id и /controller/view/id будут работать абсолютно идентично. В функции view(), id запрошенной записи будет доступен в переменной $this->params['id'].

1
2
3
4
5
6
7
8
9
Router::connect(
    '/:controller/:year/:month/:day',
    array('action' => 'index', 'day' => null),
    array(
        'year' => '[12][0-9]{3}',
        'month' => '(0[1-9]|1[012])',
        'day' => '(0[1-9]|[12][0-9]|3[01])'
    )
);

Довольно сложный пример, но он хорошо иллюстрирует какими удобными могут быть маршруты. В URL-адресе (первый параметр) определено четыре элемента маршрутов — один стандартный (:controller) для выбора правильного контроллера и три специальных.

Во втором параметре мы указываем значение по-умолчанию для элемента day = null, чтобы дать понять CakePHP что этот элемент не обязательный. Маршрут будет вызывать функцию index() контроллера.

В третьем параметре мы описываем регулярными выражениями разрешенные значения для года, месяца и дня.

Под этот маршрут будут попадать адреса /articles/2007/02/01, /posts/2004/11/16, и /products/2001/05 (не забывайте — элемент day мы определили как не обязательный), а все специальные элементы передадутся в массиве $this->params.

Предыдущие заметки по работе с маршрутами:

Теги: , , ,

Напиши комментарий!