Как обработать запрос AJAX в моем PHP MVC? - PullRequest
1 голос
/ 08 сентября 2011

Я нахожусь в процессе изучения шаблона MVC и создания собственного облегченного шаблона на PHP

Ниже приведен базовый пример того, что у меня есть сейчас.

Я немного запутался в том, как мне следует обрабатывать запросы / ответы AJAX.

В моем примере пользовательского контроллера ниже, если бы я перешел к www.domain.com/user/friends/page-14 в браузере, он создал бы User object и вызвал бы friends method этого объекта

friends methodзатем получит данные, необходимые для части содержимого моей страницы.

Мое приложение загрузит файл шаблона с верхним / нижним колонтитулом и вставит содержимое объекта выше в середину страницы.

Теперь вот где я запутался, если запрос сделан с использованием AJAX, тогда он вызовет страницу, которая выполнит процесс, включая загрузку файла шаблона.Если сделан AJAX-вызов, я думаю, что он должен каким-то образом просто вернуть часть тела / контента для моей страницы, а не создавать заголовок / нижний колонтитул.

Так что в моем MVC, где я должен собрать / загрузить этот шаблонфайл, который будет иметь содержимое верхнего / нижнего колонтитула?И где я должен определить, сделан ли запрос AJAX, чтобы я мог избежать загрузки шаблона?

Надеюсь, у меня есть смысл, мне действительно нужна помощь в выяснении, как это сделать в моем MVC, который я строю.Если вы можете помочь, пожалуйста, используйте пример кода

/**
* Extend this class with your Controllers
* Reference to the model wrapper / loader functions via $this->model
* Reference to the view functions via $this->view
*/
abstract class Core_Controller {
    protected $view;
    protected $model;

    function __construct(DependencyContainer $dependencyContainer){
        $this->view = new Core_View();
        //$this->view = $dependencyContainer->get(view);


    }

    public function load($model){
        //load model
        //this part under construction and un-tested
        $this->$model = new $model;

    }

}

пользовательский контроллер

/**
 * Example Controller
 */
class User_Controller extends Core_Controller {

    // domain.com/user/id-53463463
    function profile($userId)
    {
        //GET data from a Model
        $profileData = $this->model->getProfile($userId);

        $this->view->load('userProfile', $profileData);
    }

    // domain.com/user/friends/page-14
    function friends()
    {
        //GET data from a Model
        $friendsData = $this->model->getFriends();

        $this->view->load('userFriends', $friendsData);
    }
}

Ответы [ 3 ]

1 голос
/ 08 сентября 2011

Для меня я разработал отдельный объект, который обрабатывает все методы отображения шаблонов.Это хорошо, потому что вы можете убедиться, что все ресурсы, необходимые для отображения вашего пользовательского интерфейса, содержатся в одном объекте.Похоже, вы изолировали это в Core_View.

Затем, когда выполняется вызов AJAX, просто определите, что это вызов AJAX.Это можно сделать, выполнив вызов AJAX через объект AJAX, который затем ссылается на другие объекты, или вы можете воспользоваться простым подходом и просто установить дополнительное поле POST или GET, которое указывает вызов AJAX.

OnceЕсли вы обнаружили, что это AJAX-вызов, определите константу в вашем MVC, например AJAX_REQUEST.Затем в своем объекте шаблона / пользовательского интерфейса вы можете указать, что, если это AJAX-вызов, выводите только текст ответа.Если это не так, продолжайте включать ваши файлы шаблонов.

Для меня я отправляю его через объект AJAX.Таким образом, мне не нужно беспокоиться о том, чтобы один выход работал в обоих случаях.Когда он готов отправить ответ, я просто что-то делаю в порядке print( json_encode( ...[Response]... ) ).

1 голос
/ 08 сентября 2011

ну, это все началось бы с обычного запроса, который бы загружал начальную страницу.Есть много вариантов, чтобы справиться с этим, но допустим, что вы начинаете со страницы / users / friends, на которой перечислены все ваши друзья.тогда у каждого из друзей должна быть ссылка на профиль конкретного друга - теперь это тот момент, когда может активироваться ajax, и вы можете ajaxify ссылки на профили своих друзей - это означает, что вместо обычного вы вместо этого будете использовать, скажем, jQuery и щелкнутьобработчик таким образом, что

$("a").click(function(){$.post($(this).attr("href"), null, function(data){$("#content").html(data);}});

это будет использовать "href", и при нажатии будет отправлять запрос на ваш сервер.на бэкэнде, если вы видите, что это сообщение, вы просто вернете контент для этого конкретного друга.в качестве альтернативы, если у вас есть запрос get, вы возвращаете заголовок all - header - content - footer.

, если вы используете технику, описанную выше, не забудьте правильно обработать полученные данные.Например, если есть дальнейшие действия, которые должны быть выполнены через ajax, убедитесь, что «ajaxify» данные, которые вы получите обратно.Например, после обновления html содержимого снова примените процедуру $ ("a"). click.

Это просто тривиальный пример, чтобы начать работу, но есть много более сложных способов сделать это.если у вас есть время, я предлагаю прочитать некоторые из agiletoolkit.org, у них есть хорошая поддержка mvc + ajax.

0 голосов
/ 08 сентября 2011

Вам нужно будет использовать другое представление. Может быть что-то вроде:

funciton friends() {
    $this->view = new Ajax_Request_View();
    $friendsData = $this->model->getFriends();
    $this->view->load($friendsData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...