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

Yii2: a proper way to resolve ambiguity of controller and module names

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

app\modules\v1\controllers\UserController // 解析 /v1/users 和 /v1/users/{id} 操作 app\modules\v1\modules\user\Module.php // 嵌套模块,解析 /v1/user/... 控制器及其动作,例如/v1/user/某物/{id}

在这种情况下,UserController 与用户Module 冲突。歧义的主要原因是 Yii 2 框架的单复数魔法。我没有找到合适的解决方案来解决这种歧义。进一步我的想法如何解决它。

  1. 重命名模块。
  2. 将 UserController 重命名为 UsersController。
  3. 创建一个额外的子模块,并将 UserController 放在那里。例如。 app\modules\v1\modules\root\controllers\UserController

鉴于 Yii 2 的理念,我不确定这些选项中是否至少有一个是相当优雅和合适的解决方案。

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

我不确定我是否能完全理解这个问题,但你可能问的是 classname aliases?

use My\Full\Classname as Another;

我通常如何处理这个问题在某种程度上取决于我如何构建事物。

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

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

在将这样的控制器添加到模块本身时,我选择了一个比 'UserController' 更好的名称。当问自己 'What does this controller accomplish?/What does it do?' 这个问题时,我发现 UserController 并不能解决问题;特别是在 User 模块内时,会导致 /user/user。该控制器可能会与 User 模块中的一个或多个不同的控制器一起存在,所有这些都意味着不同的东西。因此,通常我最终只将其命名为 ApiController,结果是 /user/api。另一个控制器可能是 ProfileController。因此,当查看 URLs 时,很清楚 /user/api/user/profile 的作用。没有歧义。