以mvc结构获取对象数据

时间:2011-12-14 11:33:40

标签: php model-view-controller

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

假设我导航到以下网址: http://localhost/user/showall/

在这种情况下,调用userController.php并在该文件中有一个方法showallAction()被执行。

在showallAction()方法中,我只是对一个获取所有用户的模型请求。像这样:

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变种。当然,外观将完全不同。所以我真正想做的就是请求这个网址:

http://localhost/user/showall/

它只是给了我数组(以json格式)。所以我可以将它用于移动开发。

但是这显然不能立即完成,因为showallAction()方法假定它是用于Web浏览器显示。它不会回显JSON格式,而只是将用户数组赋予变量。

这意味着我必须创建另一个方法“showallMobileAction()”才能获取数据,但专门针对移动设备。但这不是一个优雅的解决方案。我相信这是更好的方式......

任何人都知道如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

如果您可以在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 

这是一个简单的模式来识别。然后您可以将其扩展为添加.. dunno .. pdf输出或Atom提要。

另外,有两条评论:

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

  2. View应该是一个完整的对象,绑定 域对象(负责业务逻辑的对象)。

答案 1 :(得分:0)

您可以将参数传递到您的网址:

/user/showall/json

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

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

答案 2 :(得分:0)

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