Журнал и ошибки
Когда что-то идёт не так, нужно узнать, что именно произошло. Журнал — файлы, в которые приложение записывает события и ошибки. Исключение — способ остановить действие и показать посетителю страницу ошибки. CakePHP даёт готовые средства для того и другого.
Где лежит журнал
Файлы журнала находятся в папке logs в корне проекта: ошибки попадают в logs/error.log, остальные записи — в logs/debug.log. Настроено это в разделе Log файла config/app.php.
Запись в журнал
// src/Controller/ArticlesController.php
use Cake\Log\Log;
public function view(int $id): void
{
Log::info("Открыта статья $id");
$this->set('article', $this->Articles->get($id));
}Откройте /articles/view/1 и загляните в logs/debug.log — в конце появится строка с датой, уровнем info и текстом сообщения.
Уровни
| Метод | Когда использовать | Файл |
|---|---|---|
Log::debug() | Подробности для разработчика | debug.log |
Log::info() | Обычное событие | debug.log |
Log::warning() | Что-то подозрительное | error.log |
Log::error() | Ошибка, требующая внимания | error.log |
Необработанные исключения фреймворк записывает в error.log сам — вместе с адресом запроса и цепочкой вызовов.
Функция debug
debug($article);debug() печатает переменную прямо на странице вместе с файлом и строкой вызова. Она работает только в режиме разработки. Функция dd() делает то же и останавливает выполнение.
Страница ошибки из действия
use Cake\Http\Exception\NotFoundException;
public function view(int $id): void
{
$article = $this->Articles->get($id);
if (!$article->published) {
throw new NotFoundException('Статья не найдена.');
}
$this->set(compact('article'));
}throw прерывает действие, и посетитель получает страницу с кодом 404. Неопубликованная статья выглядит для него так же, как несуществующая.
Готовые исключения
| Класс | Код |
|---|---|
BadRequestException | 400 |
ForbiddenException | 403 |
NotFoundException | 404 |
MethodNotAllowedException | 405 |
InternalErrorException | 500 |
Все они находятся в пространстве имён Cake\Http\Exception.
Как выглядит ошибка
В режиме разработки (debug равен true) страница ошибки показывает текст исключения, файл, строку и цепочку вызовов. На рабочем сервере (debug равен false) посетитель видит короткую страницу без подробностей.
Эти короткие страницы — обычные шаблоны, их можно изменить:
| Шаблон | Для каких ошибок |
|---|---|
templates/Error/error400.php | 404 и другие ошибки запроса |
templates/Error/error500.php | Ошибки сервера |
Рамку для них задаёт макет templates/layout/error.php.
Частая ошибка
На рабочем сервере страница сообщает только «An Internal Error Has Occurred», и её начинают чинить наугад или включают debug прямо на сервере. Не нужно ни того, ни другого: полный текст ошибки с файлом и строкой уже записан в logs/error.log. Первым делом открывайте журнал.