获取MVC结构中的对象数据


get object data in mvc structure

我正在使用PHP MVC框架。效果很好。我喜欢将业务层(模型)与业务逻辑(控制器)分离。但是我遇到了一个问题。是这样的:

假设我导航到以下url: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变体。当然,看起来会完全不同。所以我实际上要做的就是请求这个url:

http://localhost/user/showall/

然后返回json格式的数组。所以我可以把它用于移动开发。

但是这显然不能马上完成,因为showallAction()方法假定它是用于web浏览器显示的。它不回显JSON格式,而是简单地将用户数组赋值给一个变量。

所以这意味着我必须创建另一个方法"showallMobileAction()",以获得数据,但专门为移动设备。但这不是一个优雅的解决方案。我相信有更好的方法……

谁知道我该怎么解决这个问题?

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

如果您能在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提要。

另外,还有两个注释:

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

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

你可以把参数传递给你的url:

/user/showall/json

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

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

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