В symonfy 1.1 была введена поддержка различных форматов запроса. Но там не доставало одного важного фрагмента: поддержки ошибок. Благодаря огромной работе проделаной Kris Wallsmith в symfony 1.2 этот маленький недостаток уже исправлен. Крис создал плагин реализующий поддержку ошибок в разных форматах. Позднее его плагин был включен в ядро symfony 1.2.
Что бы проще было объяснить как это работает, рассмотрим небольшой пример. Допустим есть приложение с модулем API возвращающим HTML, XML или JSON представление статьи (модель Article). Определим правила маршрутизации:
// apps/frontend/config/routing.yml
api_article:
url: /api/article/:id.:sf_format
param: { module: api, action: atricle }
requirements:
sf_format: (?:html|xml|json)
И соответствующее действие (action) в нашем модуле:
class apiActions extends sfActions
{
public function executeArticle($request)
{
$this->article = Doctrine::getTable('Article')->find((int)$request->getParameter('id'));
$this->forward404Unless($this->article);
}
}
Теперь, если в запросе передать идентификатор не существующей статьи, запрос будет перенаправлен на страницу с 404 ошибкой. Если при этом используется HTML формат (http://localhost/frontend_dev.php/api/article/1.html) в development окружении вы получите сообщение об ошибке sfError404Exception.
В production окружении будет показана страница с 404 ошибкой "Oops! Page Not Found".
Если изменить формат запроса на XML, то в development окружении получим ответ:
и в production окружении просто:
Т.е. ошибки теперь возвращаются в том же формате, что и запрос.
И это еще не все. Сообщения об ошибках можно настраивать для каждого формата, добавляя шаблоны в директорию проекта config/error/ или конкретного приложения apps/frontend/config/error/. Например, для того чтобы настроить сообщения об ошибках для XML запросов можно создать шаблон config/error/error.xml.php примерно следующего содержания:
<?xml version="1.0" encoding="<?php echo sfConfig::get('sf_charset', 'UTF-8') ?>"?>
<error>
<code><?php echo $code ?></code>
<message><?php echo $text ?></message>
</error>
Что даст примерно следующий вывод:
В шаблонах ошибок доступны следующие переменные:
- $code - код статуса ответа
- $text - текст статуса ответа
- $name - имя класса исключения
- $message - сообщение исключения
- $traces - массив содержащий полный PHP trace
- $format - формат запроса
Но например в development окружении вместо страниц типа 404 ошибки отображаются страницы с выброшенным исключением. Как например при запросе не существующей статьи, отображается страница с исключением sfError404Exception.
Эти страницы можно настраивать за счет создания шаблонов исключений, например config/error/exception.xml.php.
Шаблоны исключений используемые по умолчанию хранятся в директории lib/exception/data/ в дистрибутиве symfony.
Для создания своего шаблона для какого-либо формата запроса, необходимо создать шаблон вида config/error/exception.FORMAT_NAME.php, где FORMAT_NAME - название формата, для которого создается шаблон.
В своих шаблонах, можно подгружать шаблоны symfony используя следующую конструкцию:
<?php include sfException::getTemplatePathForError('xml', true) ?>
навеяно: New in symfony 1.2: Error Templates and Request Formats
Комментариев нет:
Отправить комментарий