2016-08-13 2 views
0

мой код маршрутизации:Fat Free Framework Routing System приводит к неожиданному поведению

F3::route('GET @root: /', "\\Controller\\_App\\App_navigation->get_delegator"); 

F3::route('GET @modul: /@module', "\\Controller\\@module->get_index"); 
F3::route('POST @modul',   "\\Controller\\@module->post_index"); 
F3::route('GET @proses: /@module/@proc.ksd', "\\Controller\\@module->[email protected]"); 
F3::route('POST @proses',      "\\Controller\\@module->[email protected]"); 


F3::route('GET @submodul: /@module/@submodule', "\\Controller\\@module\\@submodule->get_index"); 
F3::route('POST @submodul',      "\\Controller\\@module\\@submodule->post_index"); 

F3::route('GET @proses2: /@module/@submodule/@proc.ksd', "\\Controller\\@module\\@submodule->[email protected]"); 
F3::route('POST @proses2',        "\\Controller\\@module\\@submodule->[email protected]"); 

я пытался получить доступ к proses маршрут, и это не соответствует ни одному. это неожиданное поведение?

он работает, когда я отключу submodul и proses2 имя маршрутизации.

вот экран стрелять: 101 debugging mode~

, как решить эту проблему?

+0

Кажется, что вы переопределяете одно правило маршрутизации другим. Этот конкретный адрес соответствует обоим правилам, и FFF берет последнее правило и пытается вызвать назначенный метод. Когда вы удаляете другие правила, конфликтов нет, и поведение похоже на то, что вы ожидаете. – george007

+0

ahh, так что мне нужно изменить имя? @ george007 – Kekesed

+0

Я напишу это как ответ, потому что он слишком длинный для просто комментариев ... – george007

ответ

2

На самом деле, вы попали в bug: /@module/@submodule сделал заказ на выбор более /@module/@proc.ksd, пока он не должен.

Если вы загружаете последнюю версию base.php из edge repository, ваша проблема должна быть исправлена.

+0

Итак, правила обрабатываются в том порядке, в котором они были объявлены? – george007

+0

Нет, они обрабатываются в обратном алфавитном порядке, с более низким порядком приоритета для подстановочных знаков и жетонов. Вы можете просмотреть его в [тестах] (https://github.com/bcosca/fatfree/blob/a1866cae88d67774f45465ae202004fd60a89513/app/router.php#L218). Ошибка здесь заключалась в том, что имя маркера также обрабатывалось в алфавитном порядке, пока оно не должно было быть. Итак, Kekesed попал в ошибку, потому что '@ submodule' начинается с S и' @ proc' с P. – xfra35

+0

OK, кажется законным. Молодец, сэр. – george007

0

Существует ответ xfra35, который, надеюсь, исправит вашу проблему.

Однако, по моему мнению, всегда будет сложно, если у вас есть один маршрут (в вашем примере /@module/@submodule), который является более общим, чем другой (/@module/@proc.ksd). Теоретически двигатель должен знать, что последний более строгий, чем первый. Или что первый был объявлен позже, поэтому его следует сопоставить как последний, если другие правила не совпадают. Но это не всегда так.

Если бы я был на твоих ботинках, я бы чувствовал себя безопаснее с другим решением. Например, я попытался бы объединить правила @proses и @proses2, поставив все действия, которые в настоящее время обрабатываются основными модулями в выделенные подмодули. Таким образом, каждый модуль будет иметь только метод get_index, тогда как все остальные методы get_* будут в подмодулях. Что вы думаете об этой идее?