【问题标题】:How to handle AJAX request in my PHP MVC?如何在我的 PHP MVC 中处理 AJAX 请求?
【发布时间】:2011-09-07 21:37:46
【问题描述】:

我正在学习 MVC 模式并在 PHP 中构建自己的轻量级模式

以下是我现在拥有的基本示例。

我对如何处理 AJAX 请求/响应有点困惑。

在下面的示例用户控制器中,如果我在浏览器中访问www.domain.com/user/friends/page-14,它将创建一个User object 并调用该对象的friends method

friends method 然后会获取我页面内容部分所需的数据。

我的应用会加载一个带有页眉/页脚的模板文件,并将上面对象的内容插入页面中间。

现在这是我感到困惑的地方,如果使用 AJAX 发出请求,那么它将调用一个页面来完成该过程,包括加载模板文件。如果进行了 AJAX 调用,我认为它应该以某种方式返回我的页面的正文/内容部分,而不是构建页眉/页脚的内容。

那么在我的 MVC 中,我应该在哪里构建/加载这个包含页眉/页脚内容的模板文件?我应该在哪里检测是否发出了 AJAX 请求,这样我就可以避免加载模板?

我希望我说得通,我真的需要帮助来弄清楚如何在我正在构建的 MVC 中执行此操作。 IU如果你能帮忙,请使用一些示例代码

/**
* 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);
    }
}

【问题讨论】:

    标签: php model-view-controller


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      好吧,这一切都将从加载初始页面的正常请求开始。有很多选项可以处理这个问题,但假设您从 /users/friends 页面开始,该页面将列出您所有的朋友。那么每个朋友都应该有指向特定朋友个人资料的链接 - 现在是 ajax 可以启动的时刻,您可以 ajaxify 链接到您的朋友个人资料 - 这意味着您将使用 jQuery 和 setup click 而不是正常的处理程序以这样的方式

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

      这将使用“href”,点击后会向您的后端发出发布请求。在后端,如果您看到它是帖子,那么您只需返回该特定朋友的内容。或者,如果您有获取请求,则返回所有 - 页眉 - 内容 - 页脚。

      如果您使用上述技术,请确保正确处理您收到的数据。例如如果需要通过 ajax 进行进一步的操作,请确保“ajaxify”返回的数据。例如更新内容的 html 后,再次应用 $("a").click 例程。

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

      【讨论】:

        【解决方案3】:

        您将需要使用不同的视图。可能是这样的:

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

        【讨论】:

          猜你喜欢
          • 2011-11-08
          • 2012-08-02
          • 2015-04-28
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 2010-12-01
          • 1970-01-01
          • 2021-03-10
          相关资源
          最近更新 更多