Некорректно работает роутинг в 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"
)
);
Здесь понимаю конфликт между двумя правилами. И понимаю свою логическую ошибку. Какие предложите решение данной ситуации.

21 Авг 2019 в 07:09
204 +1
1
Ответы
1

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

$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"
)
);

Таким образом, сначала будет осуществляться поиск совпадения для более специфичных маршрутов (например, для групп пользователей), а затем для более общих. Это должно помочь избежать конфликтов и правильно маршрутизировать запросы к нужным контроллерам и действиям.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир