如何处理AJAX请求在我的PHP MVC


How to handle AJAX request in my PHP MVC?

我正在学习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);
    }
}

对于我来说,我开发了一个单独的对象来处理所有模板显示方法。这很好,因为这样可以确保显示UI所需的所有资源都包含在一个对象中。看起来你已经把它隔离在Core_View中了。

然后,当进行AJAX调用时,只需检测它是AJAX调用。这可以通过AJAX对象进行AJAX调用,然后引用其他对象,或者您可以采用一种简单的方法,只需设置一个额外的POST或GET字段来指示AJAX调用。

一旦检测到它是否是AJAX调用,就在MVC中定义一个常量,如AJAX_REQUEST。然后,在模板/UI对象中,可以指定如果是AJAX调用,则只输出响应文本。如果不是,则继续包含模板文件。

对于我来说,我通过AJAX对象发送它。这样,我就不必担心为两种情况制作一个输出。当它准备好发送响应时,我只需按照print( json_encode( ...[Response]... ) )的方式做一些事情。

那么,它将从加载初始页面的正常请求开始。有许多选项可以处理这个问题,但让我们假设你从/users/friends页面开始,该页面将列出你所有的朋友。然后每个好友都应该有链接到特定好友的个人资料——这是ajax可以发挥作用的时刻你可以ajax链接到你的好友的个人资料——这意味着你可以使用jQuery并设置点击处理程序,而不是普通的方式,比如

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

将使用"href",点击后会向后端发出post请求。在后端,如果你看到它是post,那么你只会返回那个特定朋友的内容。或者,如果你有get请求,你返回all - header - content - footer。

如果您使用上述技术,请确保正确处理接收到的数据。例如,如果有进一步的动作应该通过ajax完成,确保"ajax"你得到的数据返回。例如,在更新HTML的内容后,再次应用$("a")。单击常规。

这只是一个简单的例子,但是有很多更复杂的方法。如果你有时间,我建议阅读一些agiletoolkit.org,它有很好的mvc + ajax支持。

您将需要使用不同的视图。比如:

funciton friends() {
    $this->view = new Ajax_Request_View();
    $friendsData = $this->model->getFriends();
    $this->view->load($friendsData);
}