2013-07-31 3 views
1

Мой торт URL выглядит так:CakePHP - Как создать маршруты с настраиваемыми параметрами?

$token = '9KJHF8k104ZX43'; 

$url = array(
    'controller' => 'users', 
    'action' => 'password_reset', 
    'prefix' => 'admin', 
    'admin' => true, 
    $token 
) 

Я хотел бы, чтобы это маршрут к красивее URL, как:

/admin/password-reset/9KJHF8k104ZX43 

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

/admin/password-reset 

Так что я могу поймать этот случай и перенаправление на другую страницу или отображения часов essage.

Я много читал книгу о маршрутизации, и мне все еще не кажется, что она объясняет сложные случаи должным образом таким образом, что я полностью понимаю, поэтому я не знаю, с чего это можно сделать. Что-то наподобие:

Router::connect('/admin/password-reset/:token', array('controller' => 'users', 'action' => 'password_reset', 'prefix' => 'admin', 'admin' => true)); 

Я действительно не знаю, как можно уловить токен и передать его URL.

+0

Разве это немного "тратить свои RESSOURCES"? Почему кто-то может приглушить ненужные URL-адреса? Это не индексированный очень редко используемый URL. Я не думаю, что кто-то действительно заботится о том, насколько правдоподобным для этого действия действительно является ... Особенно с административной маршрутизацией здесь. – mark

+0

Я бы хотел использовать это во многих местах, а не только в этом URL-адресе. Это всего лишь один пример. Я в основном хочу знать, как использовать настраиваемые параметры маршрута. – BadHorsie

ответ

6

Вы должны использовать именованные параметры. Для примера из одного из моих проектов

Router::connect('/:type/:slug', 
     array('controller' => 'catalogs', 'action' => 'view'), 
     array(
      'type' => '(type|compare)', // regex to match correct tokens 
      'slug' => '[a-z0-9-]+', // regex again to ensure a valid slug or 404 
      'pass' => array(
       'slug', // I just want to pass through slug to my controller 
      ) 
     )); 

Затем, на мой взгляд, я могу сделать ссылку, через которую пройдет пробка.

echo $this->Html->link('My Link', array('controller' => 'catalogs', 'action' => 'view', 'type' => $catalog['CatalogType']['slug'], 'slug' => $catalog['Catalog']['slug'])); 

Мои действия контроллера выглядит так,

public function view($slug) { 
    // etc 
} 
+0

Вам нужно использовать именованные параметры или нет способа поймать параметры, если у них нет связанных ключей? Похоже, что это сработает, даже если у вас не были именованные параметры. – BadHorsie

+0

ОК, я понял. Вы должны указать параметр как указано в вашей ссылке, но он не попадает по имени в URL-адресе. – BadHorsie

Смежные вопросы