Php 获取mvc结构中的对象数据

Php 获取mvc结构中的对象数据,php,model-view-controller,Php,Model View Controller,我正在使用一个PHP MVC框架。效果非常好。我喜欢将业务层(模型)与业务逻辑(控制器)分离。但我只是偶然发现了一个问题。事情是这样的: 假设我导航到以下url: 在本例中,将调用userController.php,在该文件中有一个执行的方法showallAction() 在showalAction()方法中,我只需对一个模型执行一个请求,该模型将为我获取所有用户。大概是这样的: public function showallAction() { // create userMode

我正在使用一个PHP MVC框架。效果非常好。我喜欢将业务层(模型)与业务逻辑(控制器)分离。但我只是偶然发现了一个问题。事情是这样的:

假设我导航到以下url:

在本例中,将调用userController.php,在该文件中有一个执行的方法showallAction()

在showalAction()方法中,我只需对一个模型执行一个请求,该模型将为我获取所有用户。大概是这样的:

public function showallAction()
{
    // create userModel object
    $users = new userModel();

    // get all users and assign the data to a variable which can be accessed in the view
    $this->view->users = $users->getAllUsers();

    // render views
    $this->view->render();
}
因此,这个方法获取所有用户,将从userModel返回的数据分配给一个变量,我可以在视图中轻松处理返回的数据。只是一个典型的MVC

现在问题来了。 我还需要创建一个原生iphone变体。当然,外观会完全不同。所以我实际上只想请求这个url:

它只是将数组(json格式)返回给我。因此,我可以将其用于移动开发

但是现在显然不能这样做,因为showalAction()方法假定它用于web浏览器显示。它不回显JSON格式,而只是将用户数组分配给一个变量

因此,这意味着我必须创建另一个方法“showallMobileAction()”,以获取数据,但特别是针对移动设备。但这不是一个优雅的解决方案。我相信有更好的方法


有人知道如何解决这个问题吗???

您可以将参数传递到url:

/user/showall/json
并使用自定义函数或内置函数获取第三个URL段。例如,使用CodeIgniter:
$this->uri->segment(3)
。 一些框架会将附加参数传递给您的方法。用我上面写的URL试试这个:

public function showallAction()
{
  print_r(func_get_args());
}

我不熟悉PHP MVC,但一般来说,我会使用“accepts”HTML头字段请求“text/HTML”或“text/json”中的响应,控制器会检查accepts类型并相应地返回响应。

在您的情况下,我会修改路由机制

如果您可以在URL的末尾添加扩展名,这将非常有用,它代表您期望的格式,如:

http://foo.bar/news/latest       >> HTML document
http://foo.bar/news/latest.html  >> HTML document
http://foo.bar/news/latest.rss   >> you RSS feed
http://foo.bar/news/latest.json  >> data in JSON format 
这是一个很容易识别的模式。您可以稍后将其展开以添加。。不知道pdf输出,或Atom提要

此外,有两点意见:

  • 模型不是对象的一种类型。相反,它是一个层,包含负责业务逻辑的对象和负责数据存储/检索的对象

  • 视图应该是一个完整的对象,您可以将域对象(负责业务逻辑的对象)绑定到它


  • 这听起来是一个可行的解决方案。向url添加扩展名,如.html或.json,对我来说没有问题。但那之后我该怎么办?假设我拥有存储在baseController中的URL中传递的扩展名:$urlExt;——这是否意味着我必须在每个Action()方法(例如在userController中)中构建一个check来检查$urlExt???@w00的类型。。然后,您应该修改视图,根据扩展为您提供不同的输出。通过初始化不同的视图实例,或者传入其他直接负责实际呈现输出的对象。这一部分与您自己的MVC模式实现紧密相关。