We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

Параметр id в роутере / Parameter ID in route

Подскажите, по какой причине не работает такой роут

$router->add('/admin/:controller/:action/:id', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
    'id'            => 3,
]);

но работает вот такой:

$router->add('/admin/:controller/:action/{id:[0-9]+}', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
    'id'            => 3,
]);

Tell me, why this route is not working:

$router->add('/admin/:controller/:action/:id', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
    'id'            => 3,
]);

But this is working fine:

$router->add('/admin/:controller/:action/{id:[0-9]+}', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
    'id'            => 3,
]);


10.2k

Нет, все хуже. По второму роуту маршрут определяется, но параметр - нет. Вот роут:

$router->add('/admin/:controller/:action/{id:[0-9]+}', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
    'id'            => 3,
]);

Вот код для проверки:

$router->handle('/admin/user/edit/6');
            if ($router->wasMatched()) {
                echo 'Модуль (Module): ', $router->getModuleName(), '<br/>';
                echo 'Контроллер (Controller): ', $router->getControllerName(), '<br>';
                echo 'Действие (Action): ', $router->getActionName(), '<br>';
                echo '<br/>Matches:<br/>';
                var_export($router->getMatches());
                echo '<br/><br/>Params:<br/>';
                var_export($router->getParams());
            } else {
                echo 'Not found<br>';
            };
            die;

Вот результат:

Модуль (Module): backend
Контроллер (Controller): user
Действие (Action): edit

Matches:
array ( 0 => '/admin/user/edit/6', 1 => 'user', 2 => 'edit', 3 => '6', )

Params:
array ( 'id' => 'user', )

Т.е., в matches все правильно, а вот в params попадает уже мусор. Что не так?



10.0k
  1. В документации есть момент, что маршрут разбирается определенным образом: действие/контроллер/параметр.
  2. Как я понял вещи {id: [preg]} используются для конвертации (есть функция convert, для преобразования параметра), при этом неявно создается переменная $id, с которой можно работать далее.
  3. Ты должен использовать ( ), по аналогии с регулярными выражениями (как я понял), для того чтобы использовать 1,2,3. Например ({id: [preg}).


10.2k

По поводу 3-го пункта - не помогает, проверял.



10.0k

Может у тебя есть другие маршруты? Существует порядок (нижний главный)

$router->add('/admin/:controller/:action/{id:[0-9]+}', [
    'module'      => 'backend',
    'controller'  => 1,
    'action'      => 2,
    'id'          => 3,
]);

$router->add('/admin/:controller/:action, [
    'module'      => 'backend',
    'controller'  => 1,
    'action'      => 2,
]);

Отработает последний.



10.2k

Да, существуют. Но работает, вроде как, именно тот, что нужно (последний в роутах):

<?php

/**
 * @var $router \Phalcon\Mvc\Router
 */

/**
 * Not found route
 */
$router->notFound([
    'module'        => 'frontend',
    'controller'    => 'error',
    'action'        => 'notFound',
]);

/**
 * Frontend routes
 */

$router->add('/', [
    'module'        => 'frontend',
    'controller'    => 'main',
    'action'        => 'index',
]);

$router->add('/:controller', [
    'module'        => 'frontend',
    'controller'    => 1,
    'action'        => 'index',
]);

$router->add('/:controller/:action', [
    'module'        => 'frontend',
    'controller'    => 1,
    'action'        => 2,
]);

$router->add('/(login|logout|register|reminder|profile|email|token)', [
    'module'        => 'frontend',
    'controller'    => 'user',
    'action'        => 1,
])->setName('user');

/**
 * API routes
 */
$router->add('/api/{version:([0-9]+(\.[0-9]+)?)}/:controller', [
    'module'        => 'api',
    'controller'    => 3,
    'action'        => 'index',
    'version'       => 1,
]);

/**
 * Backend routes
 */
$router->add('/admin', [
    'module'        => 'backend',
    'controller'    => 'main',
    'action'        => 'index',
]);

$router->add('/admin/:controller', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 'index',
]);

$router->add('/admin/:controller/:action', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
]);

$router->add('/admin/:controller/:action/{id:[0-9]+}', [
    'module'        => 'backend',
    'controller'    => 1,
    'action'        => 2,
    'id'            => 3,
]);


10.0k

Мне кажется, что маршруты не отрабатывают как надо. Попробуй исправить:

$router->add('/admin/:controller/:action/:params', [
    'module'      => 'backend',
    'controller'  => 1,
    'action'      => 2,
    'params'  => 3,
]);

Этот маршрут должен точно отработать.



10.2k

Да, этот работает. Но как заставить работать именованый параметр?



10.0k
edited Sep '14
$router->add('/admin/:controller/:action/([a-zA-Z0-9_-]+)', [
    'module'      => 'backend',
    'controller'  => 1,
    'action'      => 2,
    'id'  => 3,
]);

Так тоже должно работать



10.2k

Во блин... Работает. Надо переписать нафиг роутер, не удобный он (. Спасибо огромное.



10.0k

Рад был помочь