Как правильно в роутере вызывать ошибку 404, если она является контроллером?

Роутер воспринимает URL вида class/action/param/123/param/1234 и т.д.

Т.е. я должен проверить четность введенного URL(при разделении на массив), если он нечетный, то выдать контроллер 404
Потом проверить есть ли нужный класс, если такого нет, выдать контроллер 404.
Потом проверить есть ли нужный метод класса, если такого нет, вызвать контроллер 404.

Какую конструкцию при этих условиях использовать?
try {
//тут проводим проверку на четность URL
//если не проходит, то 
throw new Exception('не все параметры введены');

//далее подключаем нужный класс, если он есть
if(file_exist(путь к файлу)){
$startController = new $nameController();
}else throw new Exception('такого класса нет');

//проверяем наличие метода в классе
if(metod_exist($startController,  $nameAction)){
$startController -> $nameAction($params);
}else throw new Exception('такого метода нет');

//если поймали исключение, то
} catch (Exception $e) {
$startController =  new error404();
$startController -> index();
}


Норм делать так?
хочу услышать мнения...
  • Вопрос задан
  • 2617 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Мнения... у вас с раутингом уже беда, так что можно забить и дальше делать как вздумается.

если брать приведенный вами кусок:
file_exist(путь к файлу)
заменить на
if (!class_exists($nameController)) { ...
а пути ресолвить в автолоаде

Вызовы экшена подразумевают то, что у вас в качестве аргументов всегда массив. Массив параметров. Имхо это отстой. Согласитесь, так круче:
function ($id, $page = 1) {
    
}
// ...

call_user_func_array([$controller, $actionName], $params);

или вообще через рефлексии вызывать, можно тогда еще и порядок аргументов менять и ресолвить по имени.

в остальном норм. Только я бы контроллер называл как ErrorHandlingController или что-то в этом духе и перенаправлял на него любой запрос, который свалился с исключением.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
akubintsev
@akubintsev
Опытный backend разработчик
Подход с использованием исключения на мой взгляд вполне здравый. Единственный нюанс - сделайте отдельный тип исключения, например PageNotFoundException. Использовать \Exception не корректно, поскольку мало ли откуда ещё может выброситься в коде \Exception
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы