是否建议对本机站点和非本机站点使用基于API的架构?

时间:2012-07-19 11:01:19

标签: php yii restful-url

我打算使用一个架构(MVC = PHP-> Yii),我将使用基于REST API的架构用于本机站点(主要Web应用程序)和非本机(应用程序,如iPhone,BB,WAP等) )。

我的问题不建议使用带控制器模型(请求/响应+数据库)的View-Controller(HTML +用户请求)(主站点)(对于API),同样的API平台将用于非本机应用程序,或者我应该为主站点使用完整的MVC并为API构建单独的平台。这是因为我不希望主站点有额外的HTTP(cURL)开销。

更新 @karmakaze 虽然和我在一起,但我仍然需要编写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.
    }
}

还是有其他方法吗?

3 个答案:

答案 0 :(得分:1)

如果它符合您的需求,您可以基于某些JavaScript库(如AngularJsBackBone.JS或任何其他 MVC JavaScript库)构建前端。

这样你就应该只在Yii中构建一个RESTful API作为应用程序的后端。

然而,这个解决方案让我们发现了一些事情:make the application crawlable很难。

问题的观点使我明白在服务器端呈现HTML是相对重要的。我正在考虑这个解决方案:

  1. 制作正常的MVC应用,包括控制器和视图
  2. 使用以下任何一个刻度:

    • 默认情况下为GET的{​​{1}}参数,但在API调用时为false
  3. 检查此示例:

    ture
    • 一个名为的子域名,例如 api (你将拥有api.yourapp.tld),
    • 或使用请求中的其他HTTP参数来确定它是否是API调用。

    这些版本中的任何一个都将带来一种验证客户端是否为浏览器请求JSON / XML响应(API调用)或HTML的方法。

    这样可以避免为API和主站点构建单独的控制器而头痛。

    注意当它们只是呈现表单时,不需要对操作执行此操作 - 它没用。

    注意2 您可以使用后一种方法使用// 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调用,除非指定_request_fragment。像这样,您可以使用Yii抓取AngularJsBlackbone.js个应用。

    更新 $_GET['_request_fragment']已指定为here,大多数搜索引擎都会使用它来抓取AJAX网络应用程序。

答案 1 :(得分:0)

您可以对原生应用和非原生应用使用相同的功能,它也会减少您在开发时的工作以及更新或更改您的逻辑....我确实有这么多经验来处理这种情况..

答案 2 :(得分:0)

对主Web应用程序使用完整的MVC,并重用相同的模型和控制器来构建REST API。如果您在构建主Web应用程序时遵循Yii约定,则可以自动执行此扩展。只需在Yii extensions中搜索REST即可。我们将为移动应用做同样的事情。目前正在调查RESTFullYii。