CakePHP - Как создавать маршруты с пользовательскими параметрами?

URL-адрес моего торта выглядит следующим образом:

$token = '9KJHF8k104ZX43';

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

Я хотел бы, чтобы это направлялось на более красивый URL-адрес, например:

/admin/password-reset/9KJHF8k104ZX43

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

/admin/password-reset

Чтобы я мог поймать этот случай и перенаправить на другую страницу или вывести сообщение.

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

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

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


person BadHorsie    schedule 31.07.2013    source источник
comment
Разве это не пустая трата ресурсов? Зачем кому-то приукрашивать нерелевантные URL-адреса? Это неиндексируемый очень редко используемый URL. Я не думаю, что кого-то действительно волнует, насколько красив URL-адрес этого действия. Особенно с маршрутизацией администратора здесь.   -  person mark    schedule 31.07.2013
comment
Я хотел бы использовать это во многих местах, а не только в этом URL. Это всего лишь один пример. В основном я хочу знать, как использовать настраиваемые параметры маршрута.   -  person BadHorsie    schedule 01.08.2013


Ответы (1)


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

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
}
person David Yell    schedule 01.08.2013
comment
Вы должны использовать именованные параметры или нет способа перехватить параметры, если у них нет связанных ключей? Похоже, это сработает, даже если у вас не было именованных параметров. - person BadHorsie; 01.08.2013
comment
Хорошо, я понял это. Вы должны указать параметр, названный в вашей ссылке, но он не указан в URL-адресе. - person BadHorsie; 01.08.2013