Сен 29 2008
Работаем с маршрутами в CakePHP (часть 3)
Дополнительную гибкость системе маршрутов придают специальные элементы. Эти элементы вы можете определять сами, с их помощью в 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.
Предыдущие заметки по работе с маршрутами: