Некорректно работает роутинг в MVC проекте. Как исправить логическую ошибку? Доброй поры суток. Разрабатываю прототип шестой версии нашей корпоративной смс OYi. Engine. На вооружении php 5.3 vs namespaces. Фреймворк собственный. Структура классов по правилам PSR. Каждый из компонентов системы имеет базовые экшены index | create | edit | delete. По умолчанию грузится index. Примеры формирования url:mysite.ua/engine/structure --> app\controllers\engine\Structure::index() mysite.ua/engine/structure/create --> app\controllers\engine\Structure::create() mysite.ua/engine/structure/edit/1 --> app\controllers\engine\Structure::edit(1) ... mysite.ua/engine/users --> app\controllers\engine\Users::index() все было ок, но когда я начал писать группы пользователей (app\controllers\engine\users\Group) стал на грабли:mysite.ua/engine/users/group/create --> app\controllers\engine\users\Group::create() // -- все ок mysite.ua/engine/users/group --> app\controllers\engine\Users::group(); // FAIL По идее, должен запуститься app\controllers\engine\users\Group::index(), но запускается app\controllers\engine\Users::group(). Правила роутингу добавляются по приоритету. Срабатывает первое совпадение.$router->add( "/engine/users/:controller(/:action(/))", array( 'namespace'=>'app\controllers\engine\users\\', "controller" => 1, "action" => 2 ) ); $router->add( "/engine/:controller/:action(/):params", array( 'namespace'=>'app\controllers\engine\\', "controller" => 1, "action" => 2, "params" => 3 ) ); $router->add( "/engine/:controller/:action(/)", array( 'namespace'=>'app\controllers\engine\\', 'controller' => 1, "action" => 2 ) ); $router->add( "/engine/:controller(/)", array( 'namespace'=>'app\controllers\engine\\', "controller" => 1, ) ); $router->add( "/engine(/)", array( 'namespace'=>'app\controllers\engine\\', "controller" => "dashboard" ) ); Здесь понимаю конфликт между двумя правилами. И понимаю свою логическую ошибку. Какие предложите решение данной ситуации.
Для решения данной ситуации, можно изменить приоритет правил роутинга. Для этого нужно изменить порядок добавления правил в роутере. Например, можно сначала добавить правило для более специфичных маршрутов, а затем для более общих:
Таким образом, сначала будет осуществляться поиск совпадения для более специфичных маршрутов (например, для групп пользователей), а затем для более общих. Это должно помочь избежать конфликтов и правильно маршрутизировать запросы к нужным контроллерам и действиям.
Для решения данной ситуации, можно изменить приоритет правил роутинга. Для этого нужно изменить порядок добавления правил в роутере. Например, можно сначала добавить правило для более специфичных маршрутов, а затем для более общих:
$router->add("/engine/users/group(/:action(/))",
array(
'namespace'=>'app\controllers\engine\users\\Group',
"controller" => "group",
"action" => 1
)
);
$router->add(
"/engine/users/:controller(/:action(/))",
array(
'namespace'=>'app\controllers\engine\users\\',
"controller" => 1,
"action" => 2
)
);
$router->add(
"/engine/:controller/:action(/):params",
array(
'namespace'=>'app\controllers\engine\\',
"controller" => 1,
"action" => 2,
"params" => 3
)
);
$router->add(
"/engine/:controller/:action(/)",
array(
'namespace'=>'app\controllers\engine\\',
'controller' => 1,
"action" => 2
)
);
$router->add(
"/engine/:controller(/)",
array(
'namespace'=>'app\controllers\engine\\',
"controller" => 1,
)
);
$router->add(
"/engine(/)",
array(
'namespace'=>'app\controllers\engine\\',
"controller" => "dashboard"
)
);
Таким образом, сначала будет осуществляться поиск совпадения для более специфичных маршрутов (например, для групп пользователей), а затем для более общих. Это должно помочь избежать конфликтов и правильно маршрутизировать запросы к нужным контроллерам и действиям.