В Zend Framework 2 согласование содержимого происходит на уровне представления, и меня это вполне устраивает. Пример в моем контроллере:
public function viewAction()
{
$id = $this->params('id');
$user = $this->getRepository()->findUser();
return new ViewModel(array(
'user' => $user,
));
}
Это либо отображает шаблон view.phtml для возврата html, либо преобразует пользовательский объект в ответ JSON. Так называемая стратегия просмотра определяет, как отображать ответ на основе запроса.
Поток приложения REST в моем веб-приложении
Этот тип согласования контента работает довольно хорошо для многих случаев использования:
/user
илиindexAction()
возвращает массив пользователей => возможно html JSON;/user/1
илиviewAction()
возвращает пользовательский объект => возможно html или JSON (пример выше);/user/1/update
илиupdateAction()
возвращает HTML-форму. POST для этого URL-адреса возвращает html или JSON при наличии ошибок. Или в случае успеха он перенаправляется наviewAction()
и, таким образом, возвращает новую версию пользователя => html и снова возможно JSON;/user/create
илиcreateAction()
возвращает HTML-форму. POST для этого URL-адреса возвращает html или JSON при наличии ошибок. Или в случае успеха он перенаправляет наviewAction()
для только что созданного пользователя => html и снова возможно JSON
Мой вопрос
Есть несколько случаев использования, когда согласование содержимого является своего рода «требуемым» на уровне контроллера. Я не уверен, что упускаю из виду некоторые возможности: есть ли варианты, которые я могу использовать, например, в следующих случаях?
- Удалить пользователя: POST в
/user/1/delete
. В случае html-представления вы будете перенаправлены к списку пользователей (где удаленный пользователь теперь отсутствует). Если вам нужен ответ JSON, вы хотите вернуть 200 OK и объект JSON с сообщением об успешном удалении. - Разместите комментарий к статье в блоге. В случае представления в формате html вы будете перенаправлены на сообщение, к которому добавлен ваш комментарий. Если вы запрашиваете ответ JSON, вы хотите вернуть 200 OK и объект JSON с комментарием, который вы только что разместили.
Моя цель состояла бы в том, чтобы не повторять согласование содержимого, уже присутствующее на уровне представления. Это также сделало бы мои контроллеры более толстыми, поскольку теперь у меня есть два возможных ответа (JSON и html), но это может быть не единственный случай. Если позже я захочу поддерживать XML или другой формат, у меня есть переключатели для каждого действия для этих типов ответов.