Я думал о наличии уровня служб модуля Ajax с контроллерами и действиями, которые взаимодействуют с моей моделью. Легкий, но не очень расширяемый и нарушил бы DRY. Если я изменяю логистику некоторого процесса, я должен буду отредактировать контроллеры Ajax и нормальные контроллеры.
Так идеально я загрузил бы те же самые действия и для пользователей JavaScript и для не-JavaScript. Я думал о, возможно, проверке $_POST['ajax']
, если бы это установлено, я загрузил бы другое (json'y) представление для данных. Задавался вопросом how/a хороший способ сделать это (плагин фронтального контроллера, который я воображаю?) или если кто-то может указать на меня на АКТУАЛЬНОЕ учебное руководство, которое описывает действительно хороший путь к тому, чтобы создать большее ajax приложение.
Вы можете использовать объект request, чтобы определить, был ли запрос через ajax, например:
// from your controller
if($this->getRequest()->isXmlHttpRequest()) {
// an ajax request, do something special (e.g. render partial view)
} else {
// render entire view
}
Это в основном проверка на наличие заголовка x-requested-with
(который не всегда присутствует, в зависимости от библиотеки JS и т.д.). См. (в разделе "обнаружение ajax-запросов"):
http://framework.zend.com/manual/en/zend.controller.request.html
Вы можете проверить наличие заголовков XmlHttpRequest. Однако не все библиотеки Javascript делают это, и даже те, которые делают, не обязательно делают это во всех браузерах.
Существует также AjaxContext, который в основном проверяет переменную запроса "context", аналогично вашей идее $_POST['ajax'].
То, что я в итоге сделал, было похоже на ваше первоначальное предложение. Я создал модуль AJAX. Чтобы избежать дублирования кода контроллеров, я создал сервисный слой, который обрабатывает все операции над моделями, поэтому мои контроллеры действительно отвечают только за преобразование запросов ввода и отображение.