0

我计划使用一种架构(MVC = PHP->Yii),我将为本地站点(主要 Web 应用程序)和非本地站点(iPhone、BB、WAP 等应用程序)使用基于 REST API 的架构。

不,我的问题是建议将 View-Controller (HTML+User Requests) (For Main Site) 与 Controller-Model (Request/Response+DB) (for 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.
    }
}

还是有其他方法?

4

3 回答 3

1

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

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

然而,这个解决方案暴露了一些东西:很难让应用程序可抓取

问题的角度让我明白了在服务端渲染HTML是比较重要的。我正在考虑这个解决方案:

  1. 制作普通的 MVC 应用程序,包括控制器和视图
  2. 使用以下任一记号:

    • 默认情况下的GET参数,但当它是 API 调用时:falseture

检查这个例子:

// 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']指定。像这样,您可以使用 Yii制作AngularJsBlackbone.js应用程序。

UPDATE这里_request_fragment指定,大多数搜索引擎都使用它来爬取 AJAX Web 应用程序。

于 2012-07-21T16:50:07.697 回答
0

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

于 2012-07-20T02:58:18.303 回答
0

您可以对本机和非本机应用程序使用相同的方法,它还会减少您在开发时间的工作以及更新或更改您的逻辑......我确实有很多这种情况的经验......

于 2012-07-19T11:09:15.373 回答