У меня есть небольшое / среднее PHP-приложение, созданное для практических навыков ООП и MVC. У меня есть файл init / bootstrap, который вызывает Router, который вызывает Controller -> Service Layer -> Repository (Database), а затем отправляет обратно переменные в View Layer (все зависимости обрабатываются с помощью DiC / IOC).
Я создал абстрактный класс BaseException, который расширяет класс Core Exception . Тогда у меня разные классы исключений – DatabaseException, FileException и т. Д.
Пример триггера Исключение: в слое базы данных я пытаюсь извлечь данные из базы данных, если она не удалась, она генерирует новое DatabaseException.
Пример 2: В классах, в которых я обрабатываю файл, включается, сохраняет, удаляет – если возникает ошибка, он генерирует новое FileException.
Где поставить код catch catch, в файл init / bootstrap или, возможно, в BaseController? Но что, если Controller терпит неудачу и выбрасывает какое-то исключение ControllerException.
По-моему, это может выглядеть так (файл init.php ):
try { // create new router $router = $container->get('Router'); $router->import'Config/routes.php'); // run the router $router->route(); // load controller $dispatcher = $container->get('Dispatcher'); $dispatcher->load(); } catch (DatabaseException $e) { echo "Database error!"; $log->log('Database error', $e->getMessage()); } catch (FileException $e) { echo "File error!"; $log->log('File error', $e->getMessage()); } catch (Exception $e) { // default echo "Some exceptional error!"; $log->log('Default exception', $e->getMessage()); }
Еще один вопрос, как регистрировать эти исключения (ошибки), например, пример выше, или я должен добавить класс журнала в BaseException и обрабатывать его там?
Как и в простой php, вы можете реализовать try / catch по всему, что вам может понадобиться.
В моих проектах (как пользователь среды MVC) я обычно обрабатываю исключения в моих методах контроллеров, поскольку они обязаны обрабатывать процессы в приложении. Но если нужно, я бы использовал его в промежуточном программном обеспечении или даже в модели, если захочу.
В вашем случае кажется, что вы хотите, чтобы ваша инфраструктура обрабатывала исключение, прежде чем выводить его на пользовательский интерфейс, как это делает Laravel (также многие другие).
Вы можете выполнить это с set_exception_handler()
функции set_exception_handler()
из PHP.
Ниже приведен пример, основанный на примере документов :
set_exception_handler(function($exception){ //you could write in a log file here for example... echo "Uncaught exception: " , $exception->getMessage(), "\n"; });