Solved thread

This post is marked as solved. If you think the information contained on this thread must be part of the official documentation, please contribute submitting a pull request to its repository.

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

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

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

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

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

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

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

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



7.2k

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



6.6k

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

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

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

МБ он проверяет на что-то типа ```php if ( ! is_numeric($controller)) {} ```



6.6k

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

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

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



6.6k
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,
]);


6.6k

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



6.6k

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

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

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

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



6.6k

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

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

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



6.6k

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



6.6k
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 не поддерживают русский язык, это есть в доках ( http://docs.phalconphp.com/en/latest/reference/routing.html#defining-routes ): /:action - /([a-zA-Z0-9_]+) , но т.к. система ожидает там корректное значений action - выводится ошибка маршрутизации.

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



6.6k

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



6.6k

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