Есть сайт со статьями и адрес статьи:
web.com/art/artname
Где art - раздел со статьями, artname - url статьи по нему же идет поиск в БД. В роутере это выглядит так:
$class = $request->$controller.'.controller';
$obj = new $class;
$act = $obj->showArticle($request->action);
Но потом требуется другой функционал, например авторизация и адрес
web.com/auth/login
автоматически вызовется auth.controller но дальше проблема потому что в auth.controller нет метода showArticle, а он задан жёстко в роутере.
Варианты:
1) Увеличить длинну URL на секцию в которой казать действие:web.com/art/show/artname
web.com/art/edit/artname
web.com/auth/enter/login
Тогда можно сделать всё чётко:
$class = $request->$controller.'.controller';
$obj = new $class;
$act = $obj->$request->action($request->data);
2. Внедрить всем классам один главный метод по-умолчанию, например main и увеличить количество классов не увеличивая секции в URL, редактирование статьи тогда окажется по адресу
web.com/artedit/artname
$class = $request->$controller.'.controller';
$obj = new $class;
$act = $obj->main($request->action);
3. Сделать ветвление if в роутере, самый плохой вариант на мой взгляд, не хочется о нём думать ))if($controller == 'art'){
$act = $obj->showArticle($request->action);
}
elseif($controller == 'artedit') {
$act = $obj->edit($request->action);
}