Yii2:解决控制器和模块名称歧义的正确方法

时间:2017-11-16 05:57:32

标签: php rest yii yii2

据我所知,目前Yii 2没有开箱即用的方法来解决控制器和模块名称的歧义。模块层次结构的一个示例,用于描述我的意思:

app\modules\v1\controllers\UserController //解析/ v1 / users和/ v1 / users / {id}操作 app\modules\v1\modules\user\Module.php //嵌套模块,解析/ v1 / user / ...控制器及其操作,例如/ V1 /用户/东西/ {ID}

在这种情况下,UserController与用户Module冲突。歧义的主要原因是Yii 2框架的奇异复数魔法。我没有找到解决这种模糊性的适当解决方案。我的想法如何解决它。

  1. 重命名模块。
  2. 将UserController重命名为UsersController。
  3. 创建一个额外的子模块,并将UserController放在那里。例如。 app\modules\v1\modules\root\controllers\UserController
  4. 我不确定这些选项中至少有一个是非常优雅的选择,也是Yii 2哲学的正确解决方案。

    回到主要问题,Yii 2哲学解决这个问题的更合适的方法是什么?控制器和模块是两种不同类型的对象,它们是不同的复数或不同,因此应该是在所述情况的路由中将它们分开的正确方法。

2 个答案:

答案 0 :(得分:0)

我不确定我是否能够完全理解这个问题,但您可能会问classname aliases

use My\Full\Classname as Another;

答案 1 :(得分:0)

我通常如何处理这一点取决于我如何构建事物。

假设我有usersdepartmentsorders以及其他一些内容。所有这些概念都有自己的模块,可以在其中进行所有交互。如果我想为所有这些概念创建REST控制器,我可以选择为每个模块添加一个控制器,或者我可以为控制器创建一个专用的API模块。

为此目的创建专用模块时,我通常将其命名为api,可能内部有一些嵌套的版本控制模块。所以在这种情况下,我会得到以下结构app\modules\api\controllers\UserController,这将导致URL /api/user。这里没有歧义,而且非常清楚这是什么意思。

当将这样的控制器添加到模块本身时,我选择一个比'UserController'更好的名称。当问自己这个问题'这个控制器做了什么?/它做了什么?'我发现只有UserController没有削减它;特别是在User模块内部时,会产生/user/user。该控制器可能与User模块中的一个或多个不同控制器一起存在,所有控制器都用于不同的控制器。因此,通常情况下,我最终仅将其命名为ApiController,从而产生/user/api。另一个控制器可能是ProfileController。因此,在查看网址时,很清楚/user/api/user/profile做了什么。没有歧义。