Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii-向webapp添加RESTFull API_Php_Api_Rest_Yii_Yii Extensions - Fatal编程技术网

Php Yii-向webapp添加RESTFull API

Php Yii-向webapp添加RESTFull API,php,api,rest,yii,yii-extensions,Php,Api,Rest,Yii,Yii Extensions,我有一个基于Yii框架构建的用于管理酒窖的现有应用程序。我使用标准Gii实用程序创建初始CRUD控制器/模型/视图。我对代码进行了重大修改,以满足我对导航、外观和功能的需求。我现在开始设计一个配套的移动(android)应用程序,它需要消费和创建一些数据(在我的酒窖中获取葡萄酒列表-获取,在酒窖中添加新葡萄酒-发布),这些数据可以在外出购物/品酒时使用。我不打算将所有模型/控制器选项公开为web服务,只公开一组特定的函数 我的问题实际上是一个设计问题。我应该将API方法添加到现有的CRUD控制器

我有一个基于Yii框架构建的用于管理酒窖的现有应用程序。我使用标准Gii实用程序创建初始CRUD控制器/模型/视图。我对代码进行了重大修改,以满足我对导航、外观和功能的需求。我现在开始设计一个配套的移动(android)应用程序,它需要消费和创建一些数据(在我的酒窖中获取葡萄酒列表-获取,在酒窖中添加新葡萄酒-发布),这些数据可以在外出购物/品酒时使用。我不打算将所有模型/控制器选项公开为web服务,只公开一组特定的函数

我的问题实际上是一个设计问题。我应该将API方法添加到现有的CRUD控制器中,还是应该为每个模型创建一个新的“API控制器”(或者我看到的另一个选项是单个apiController)?我的想法是分离API控制器。这将允许我更容易地更新/部署特定于API的更改,并在逻辑上划分接口。这个API需要经过身份验证,我可能会在将来的版本中实现OAuth


顺便说一句,我已经看过RESTFullYii扩展,但我还不能确切了解它是如何工作的。我真的很想看到一个工作示例应用程序,而不仅仅是代码片段

是,选择单独的控制器。您甚至可能希望设置一个单独的应用程序,该应用程序共享您的一些应用程序模型和配置,但也允许更独立的感觉


此外,还需要规划Api的版本,因为它可能需要更改,同时还需要支持较旧的Android应用程序。我建议您创建一个新的控制器。例如ApiController。您将所有操作,如
actionAddWine
,都放入。因此,您可以将此操作称为:

http://example.com/index.php?r=api/addWine
这样做的好处是,您拥有所有的模型,您只需要通过REST与您的模式交互。为了创建一个简单的RESTAPI,您可以查看下面的文档,该文档非常简单

如果您喜欢上面提到的文章,只需使用
\u sendResponse()
方法即可将响应发送到客户端。 另一件事是使用控制器的
init()

另一种方法是为应用程序创建模块。如果您想将API与其他代码完全分开,可以创建一个模块。您可以使用GII创建模块。该模块的优点是,您可以分隔各个部分。例如,您的操作将是:

http://example.com/index.php?r=api/wine/add
在上面的url中,您正在
api
模块和
wine
控制器中调用一个操作,其名称为
add


请注意,您可以通过导入模型来使用模块中的模型。

我非常喜欢使用模块的建议。URI更符合真正的REST格式和实现。我想我可以更新UrlManager来删除“index.php”并将其还原为。如果需要,这还允许我通过简单地映射到(如果不在URI中,则默认映射到最新版本)来对api进行版本设置。