我正在使用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()”才能获取数据,但专门针对移动设备。但这不是一个优雅的解决方案。我相信这是更好的方式......
任何人都知道如何解决这个问题?
答案 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提要。
另外,有两条评论:
模型不是一种对象。相反,它是一个层,包含负责业务逻辑的对象,以及负责数据存储/检索的对象。
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”中的响应,控制器会检查接受类型并相应地返回响应。