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

Снова баг(?) в Router

Добрый день. Снова какая-то не понятная (для меня) ситуация с роутами. Знатоки внутренностей, объясните plz... Если коротко, есть 2 роута:

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

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

Есть 1 контроллер: IndexController. Захожу на /123 и... попадаю в IndexController. Где логика?

А если местами их поменять, для эксперимента?

И в чем косяк? Вроде как PHP на такие вещи ругается

class 123Controller

И я так думаю что пытается следущий роут использовать, или дефолтные настройки



8.1k

Ну да, это глобальный баг PHP. Нужно публиковать баг-репорт. Только не сейчас, а 1 апреля. По-сути. Вы вызываете контроллер. Контроллер - класс, значит, он не может иметь имя, начинающееся с цифры, как и любая переменная в PHP. Далее, замечено, что, если не описана обработка события, когда роут не найден, идет переадресация на index контроллер. Так что никакго бага нет. Сделайте обработку NotFound, и все. И при разработке включите E_ALL & display_errors = On Еще внимательно перечитайте документацию на предмет порядка обработки маршрутов



10.2k

@boston, пробовал. Не влияет на результат. @vanchelo, да какая разница? Если в системе нет роута с таким классом, должен сработать exception, а не браться дефолтный роут. Для /asd работает правильно (показывает 404-ю ошибку), а для цифр нет. @Oleg, да ладно? Серьезно? Ну ты гений... Уточню (для гениев), роут создавался так:

$router = new \Phalcon\Mvc\Router(false);

Должна с false идти на дефолтный контроллер? Обработка notFound есть. Вывод ошибок включен в index.php. Хоть бы проверил сначала... Далее: автолоадер обрабатывает запрос на файл с классом контроллера. Файла нет. С чего бы вдруг не выбросить стандартное исключение? Ну и последний вопрос: почему для /asd и /123 фреймворк работает по разному? Ни в первом, ни во втором случае нет роута, который можно использовать. Соответственно, работать должно идентично. С сарказмом у тебя плохо, тренируйся...

Действительно странно работает Сделал тоже самое /123 - 200 OK /123a - 123aController handler class cannot be loaded

МБ он проверяет на что-то типа

if ( ! is_numeric($controller)) {}


10.2k

А смысл в такой проверке?

Ты у меня спрашиваешь за смысл? Я не предлогаю никаких проверок, а всего лишь сделал предположение

согласен) поведение не совсем логичное)



10.2k
edited Aug '14

Ну и еще один баг в роутере phalcon. Досконально его изучать не стал, т.к. уже понял, что надо написать замену Router и Route для полноценной работы, но для информации другим расскажу. В общем, в роутах есть именованные параметры. Баг заключается в том, что они поддерживаются не полностью. Например так будет работать:

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

А вот так уже не будет работать:

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

Баг все тот-же: криво работает роутер с опциональными параметрами. Решение, кому необходимо, заключается в использовании полноценных регулярок в роутах. Для данного примера оно будет примерно таким:

$router->add('/test(/(?P<id>[0-9]+))?', [
    'module'     => 'backend',
    'controller' => 'test',
    'action'     => 1,
    'id'         => 2,
]);


10.2k

Ну и еще один баг: роутер в упор не понимает русский язык. Нет, я не создаю ссылки на русском, хотя и не считаю, что это не правильно - для .рф доменов это абсолютная норма.



10.2k

Интересно, "гений" @Oleg снова порекомендует "писать багрепорт 1-го апреля" и "перечитать документацию"?) Или снова скажет "никакго бага нет"? А, @Oleg? )))

@aktuba не надо и в этой теме переходить на личности.

Для найденных багов есть специальное место, при правильном описании проблемы решение будет получено очень быстро: https://github.com/phalcon/cphalcon/issues

// Про "нет бага" - каждый фреймворк ведёт себя оп своему, привыкшим к одному fw поведение другого будет считаться нелогичным, и наоборот.



10.2k

@boston, да разве-ж я перехожу на личности? так, небольшой троллинг умников, которые сами не знают, но других поучают... все-все, больше не буду). По поводу баг-трекера на гитхабе - сорри, не могу. Плохенько у меня с инглишем. Ну и поведение fw тут не при чем: если заявлена поддержка PCRE - значит должно быть реализовано. Ну и обработка любых урлов должна присутствовать.

Phalcon только развивается, причем активно. Если не указывать разработчикам на ошибки и несоответствия - то они и не будут предпринимать действия для их исправления.

Опиши на русском тут описание проблемы и код для её воспроизведения, перенесу всё в issue. Кратко и лаконично.



10.2k

Блин... Что за глюки на форуме - постоянно разлогинивает. Расписывал все баги, которые нашел, нажал "Add Comment", получил "error user_id" и комментарий стерся (. Вечером попробую еще раз написать (.



10.2k
edited Aug '14

@boston, лови:

  1. Баг с цифрами в параметрах ссылки (контроллер, действие, возможно namespace и module тоже - их не проверял). Например, есть роуты:
$router->add('/admin/:controller', [
    'module'        => 'test',
    'controller'    => 1,
    'action'        => 'index',
]);

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

Вот как будут обрабатываться ссылки:

/admin/controller - откроет контроллер Controller и дефолтный action, т.е. работает правильно /admin/123 - откроет дефолтный контроллер и дефолтный action, вместо 404-й ошибки /admin/controller/edit - откроет контроллер Controller и action edit, все нормально /admin/controller/123 - откроет контроллер Controller и дефолтный action вместо 404-й ошибки.

Причина ошибки где-то здесь: https://github.com/phalcon/cphalcon/blob/master/ext/mvc/router.c#L840

  1. Баг с русским языком в ссылках. Для тех-же роутов, что выше, проверяем:
$router->handle('/admin/index/eng');
if ($router->wasMatched()) {
    echo 'Модуль (Module): ', $router->getModuleName(), '<br/>';
    echo 'Контроллер (Controller): ', $router->getControllerName(), '<br>';
    echo 'Действие (Action): ', $router->getActionName(), '<br>';
} else {
    echo 'Маршрут не поддерживается<br>';
};
die;

для /admin/index/eng выдает: Модуль (Module): test Контроллер (Controller): index Действие (Action): eng

для /admin/index/русский - "Маршрут не поддерживается", хотя должен был определить модуль и контроллер для корректной обработки 404-й ошибки.

  1. Проблема с опциональными параметрами в роутах. Вот так будет нормально работать:
$router->add('/test/{id:[0-9]+}', [
  'module'     => 'backend',
  'controller' => 'test',
  'action'     => 'index',
  'id'         => 1,
]);

а вот так работать уже не будех, хотя заявлена поддержка PCRE:

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

Вообще, с опциональными параметрами полная беда. Регулярки поддерживаются только частично.

  1. Есть проблема с View. Если назначить нативный шаблонизатор для .php - часть функционала начинает глючить. Если использовать .phtml (т.е. не прописывать дополнительные расширения для рендера) - все работает отлично. Обнаружил, когда делал модуль для e-mail. Сейчас уже не помню деталей, будет время - постараюсь восстановить последовательность действий и конкретные ошибки и выложу сюда.

По п.2 - в дефолтных роутах правила для :action не поддерживают русский язык, это есть в доках ( https://docs.phalcon.io/en/latest/reference/routing.html#defining-routes ): /:action - /([a-zA-Z0-9_]+) , но т.к. система ожидает там корректное значений action - выводится ошибка маршрутизации.

В остальном (кроме п.4) понял, перепроверю и буду разбираться.



10.2k

По п.2 понял свою ошибку, спасибо.



10.2k

Во, хорошая новость, спс!