@Dreaded

Как правильно организовать ajax запросы в MVC архитектуре?

В общем, никак не могу понять, какой вариант правильный , по поводу ajax запросов в MVC структуре. Как всё таки их правильно организовать?

Точка входа на сайт у меня одна, соответственно ajax-запрос мы должны отправлять на front-controller. Сам фронт контроллер на данный момент выглядит очень просто:

$routes = new \App\Components\Router();
    $routes->run();


Как я понимаю на первом этапе, нам нужно осуществить проверку ajax запрос к нам пришёл или нет. Соответственно возникает первый вопрос - где это реализовать? В самом фронт контроллере написать проверку и в случае ajax запроса создавать новый объект типа AjaxController и дальнейшую обработку полностью возложить на него? Или же отдать всё это роутеру, где в методе run определять какого типа запрос(или же вообще написать отдельный метод) и продолжить обрабатывать его в роутере?

Окей, допустим, что наш запрос уже обрабатывается, значит в теле запроса мы должны передать имя контроллера, метод и параметры. Соответственно на каждый ajax запрос у меня должен быть отдельный контроллер? Или я создаю лишь один контроллер предназначенный для выполнения только лишь ajax запросов и описываю в нём разные методы?.
Например, в моём проекте ajax запросы используются для отправки различных форм, и динамической загрузки контента. В каком направлении нужно двигаться? Вот так?

/*
    *AjaxController
    */
    class AjaxController
    {
        public function actionGetContent()
        {
            //подгружаем контент
        }
        
        public function actionSendRegistrationFormData()
        {
            //отправляем данные формы регистрации
        }

        public function actionSendLoginFormData()
        {
            //отправляем данные для логина на сайт
        }
        
    }


Или же работу с каждым объектом сайта вынести в отдельный контроллер?
  • Вопрос задан
  • 1209 просмотров
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Логичнее вынести все в ajaxController() и работать в нем только с запросами аякса, это в частности позволяет в конструкторе контроллера не вызывать кучу специфических для данного раздела методов, а так же сразу определить для вью соответствующий лэйаут, однако это как раз не всегда удобно. По этому у меня есть аякс контроллер, в который я отсылаю только аякс запросы общего назначения, не привязанные к какому то конкретному разделу(в конструкторе сразу можно обработать тип и сделать ексит если не аякс), а запросы с более четким типом, например работа с пользователем, идет в свой контроллер, и уже в экшене проверяется тип запроса и производятся нужные действия. Это немного более накладно по ресурсам(из за конструктора с доп. функционалом), но более удобно в плане "все подобное в одном месте".
На уровне роутера имхо никаких обработок быть не должно, его задача отдать роут, а контроллер уже создает логику ответа.
Ответ написан
Комментировать
@LiguidCool
Добавьте стандартному контроллеру функцию определения типа запроса из хедера и в зависимости от этого выдавайте содержимое View либо чистый Json.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
soprun
@soprun
Software Architecture
Как правильно организовать ajax запросы в MVC архитектуре?


Вопрос абсолютно не логичен, не понятен про что вообще и как они могут быть взаимосвязанными.

Будь то:
  • MVC - Model View Controller (Модель-Вид-Контроллер)
  • Page Controller (Контроллер страницы)
  • Front Controller (Контроллер входа / Единая точка входа)
  • Application Controller (Контроллер приложения)
  • Two Step View (Двухшаговая шаблонизация)


да и вообще любой паттерн веб-представления, он не как не связан с AJAX или другим видом передачи данных.

Не буду вдаваться в подробности реализации, кажется вопрос в том, как организовать пространство имен "namespace".

Первое что нужно сделать, определится о каком Application Program Interface (API) мы будем говорить.
Предлагаю для упрощения говорить далее о REST.

Представим что у нас есть некий DTO (Data Transfer Object) Product - который необходимо серелизовать и передать по сети.

Вот примеры простейших запросов REST:

Корневые (независимые) сущности API:
GET /products — получить все продукты.
GET /products/123 — получить информацию по продукту с ID 123.
GET /categories - получить все категории.

Зависимые (от корневой) сущности:
GET /products/555/variants — все варинты продукта с ID 555.
GET /products/555/variants/456/specifications — получить спецификацию варианта 456 продукта 555

Ух.. уже страшно.

И так, коль вопрос про организацию пространства для REST, то как вариант можно рассмотреть следующие.

App\......\Controllers\AbstractController.php - Абстрактрый класс контроллеров.
App\......\Controllers\Product\ProductController.php - отвечает за продукт
App\......\Controllers\Product\VariantController.php - отвечает за варианты продукта
App\......\Controllers\Product\SpecificationController.php - отвечает за спецификацию варианта продукта

Или же работу с каждым объектом сайта вынести в отдельный контроллер?


Каждый из контроллеров отвечает за свою сущность и имеет свой набор CRUD методов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы