我计划使用一种架构(MVC=PHP->Yii),其中我将使用基于REST API的架构用于本地网站(主要网络应用程序)和非本地网站(如iPhone、BB、WAP等应用程序)。
不,我的问题是,建议使用View-Controller(HTML+用户请求)(用于主站点)和Controller-Model(Request/Response+DB)(用于API),并且相同的API平台将用于非本地应用程序,还是我应该对主站点使用完整的MVC并为API构建单独的平台。这是因为我不希望主站点有额外的HTTP(cURL)开销。
更新:@卡马卡泽我就是这样,但我仍然必须编写RestControllers,因为其中涉及到很多代码。所以不管怎样,我们最终会有两个不同的控制器,例如
UserController extends CController {
actionRegister() {
...Some calculations
.
.
Instead of making Calls to model We will use call controller i.e.
$userRest = new UserRestController();
/*
* This will return json data or php obj depending on params passed or
* may raise an exception
*/
$userRest->actionCreate($param1, $param2);
// Process data obtained.
}
}
或者还有其他办法吗?
如果它符合您的需求,您可以基于一些JavaScript库构建前端,如AngularJs、BackBone.JS或任何其他MVCJavaScript库。
通过这种方式,您应该只在Yii中构建一个RESTful API,作为应用程序的后端。
然而,这个解决方案暴露了一些问题:很难使应用程序具有可爬网性。
这个问题的视角让我明白了在服务器端呈现HTML是相对重要的。我正在考虑这个解决方案:
- 制作正常的MVC应用程序,包括控制器和视图
-
使用以下任意记号:
GET
参数,默认情况下为false
,但当它是API调用时为ture
:
检查此示例:
// in a controller:
public function actionView($id, $api=false) {
// some calculations, getting the $model variable
if ($api) {
echo $model->json_output(); // you can implement it in components/model.php or generate the json output some other way
} else {
render('view', array('model'=>$model));
}
}
- 一个名为api的子域(您将拥有api.yourapp.tld)
- 或者使用来自请求的另一个HTTP参数来确定它是否是API调用
这些版本中的任何一个都将提供一种方法来验证客户端是否请求浏览器的JSON/XML响应(API调用)或HTML。
这样可以避免为API和主站点构建单独控制器的麻烦。
注意当操作只是呈现一个表单时,不需要对其执行此技巧-这是无用的。
注意2您可以使用后一种方法来呈现具有_request_fragment
的请求,并假设每个请求都是API调用,除非指定了$_GET['_request_fragment']
。像这样,你可以让AngularJs,Blackbone.js应用程序可以用Yii进行爬网。
UPDATE_request_fragment
在此处指定,大多数搜索引擎都使用它来抓取AJAX web应用程序。
您可以将其用于本机和非本机应用程序,这也将减少您在开发时的工作量,并更新或更改您的逻辑。。。。我对这种情况确实有很多经验。。
对主web应用程序使用完整的MVC,并重用相同的模型和控制器来构建REST API。如果你在构建主要的网络应用程序时遵循Yii惯例,有一些扩展可以自动做到这一点。只需在Yii扩展中搜索REST即可。我们也将为我们的移动应用程序做同样的事情。目前正在调查RESTFullYii。