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 框架的单复数魔法。我没有找到合适的解决方案来解决这种歧义。进一步我的想法如何解决它。
- 重命名模块。
- 将 UserController 重命名为 UsersController。
- 创建一个额外的子模块,并将 UserController 放在那里。例如。
app\modules\v1\modules\root\controllers\UserController
鉴于 Yii 2 的理念,我不确定这些选项中是否至少有一个是相当优雅和合适的解决方案。
回到主要问题,Yii 2 哲学更适合解决这个问题的方法是什么? Controller 和 Module 是两种不同类型的对象,复数与否是不同的,因此对于所描述的情况,在路由中将它们分开应该是正确的方法。
我不确定我是否能完全理解这个问题,但你可能问的是 classname aliases?
use My\Full\Classname as Another;
我通常如何处理这个问题在某种程度上取决于我如何构建事物。
假设我有 users
、departments
、orders
,也许还有其他一些东西。所有这些概念都有自己的模块,所有交互都在其中进行。如果我想为所有这些概念创建 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
的作用。没有歧义。
据我所知,目前 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 框架的单复数魔法。我没有找到合适的解决方案来解决这种歧义。进一步我的想法如何解决它。
- 重命名模块。
- 将 UserController 重命名为 UsersController。
- 创建一个额外的子模块,并将 UserController 放在那里。例如。
app\modules\v1\modules\root\controllers\UserController
鉴于 Yii 2 的理念,我不确定这些选项中是否至少有一个是相当优雅和合适的解决方案。
回到主要问题,Yii 2 哲学更适合解决这个问题的方法是什么? Controller 和 Module 是两种不同类型的对象,复数与否是不同的,因此对于所描述的情况,在路由中将它们分开应该是正确的方法。
我不确定我是否能完全理解这个问题,但你可能问的是 classname aliases?
use My\Full\Classname as Another;
我通常如何处理这个问题在某种程度上取决于我如何构建事物。
假设我有 users
、departments
、orders
,也许还有其他一些东西。所有这些概念都有自己的模块,所有交互都在其中进行。如果我想为所有这些概念创建 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
的作用。没有歧义。