在Yii中处理URL路由/控制器的最佳方式


Optimal way to handle URL routing/Controllers in Yii

我正在尝试开发一个RESTful Yii web服务。在项目的顶层,我使用数据库模式+ GiiX创建了我的模型。我有一个web服务(ws)模块,我希望web服务驻留在其中。现在模型非常简单:

  • Product(属于Brand,有一个Analysis)
  • Brand(有多个Product)
  • Analysis(属于一个Product)

我想智能地创建urlManager规则,这样我就不必在创建新操作和/或新控制器时不断添加新规则。我不确定的是如何做到这一点。请记住,现在我只是试图为用户提供在标准上使用一些过滤器列出它们的能力。

首先,我应该为我可能想要工作的每个模型创建一个单独的控制器-如ws/ProductController, ws/BrandController, ws/AnalysisController -或者我应该只有一个ws/WebServiceController,其操作对应于每个潜在的返回类型?

记住第一个问题的答案,我应该使用哪些URL规则来完成以下操作:

  • ws/*控制器执行一个不带参数的操作;
  • 用一些参数对ws/*控制器做一个动作;

另外,现在我只使用GET。

我确实看了一下Yii的http://www.yiiframework.com/wiki/175/how-to-create-a-rest-api/关于创建RESTful API的页面,但对于如何将他们的示例应用到我自己的示例中有点困惑。

两种方法都可以。创建单独的控制器和在单个控制器中放置多个动作都是可行的。就我个人而言,我认为创建一个Ws模块并在其中放置多个控制器将是很好的。每个模型一个:

modules
  ws
    controllers
      ProductController
      BrandController
      …  

这样你会自动得到足够好的url: ws/product, ws/brand, ws/brand/search, ws/product/order

首先,我应该为我想要的每个模型创建一个单独的控制器吗比如ws/ProductController, ws/BrandController,ws/AnalysisController——或者我应该只有一个ws/WebServiceController,带有与每个势对应的动作返回类型?

我也认为这取决于你的应用。就我个人而言,我会为每个模型创建一个自己的控制器,如果需要的话,可能会引入一个基类、行为或过滤器。

在不带参数的ws/*控制器上执行一个操作;对…采取行动带有一些参数的ws/*控制器;

假设你的模块注册为"webService",你可以使用这些规则:

'ws/<_c>' => 'webService/<_c>',
'ws/<_c>/<model:'w+>/<id:'d+>' => 'webService/<_c>',

$_GET参数的使用不依赖于你的规则,你可以用它们来使url更好。