据我所知,目前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框架的奇异复数魔法。我没有找到解决这种模糊性的适当解决方案。我的想法如何解决它。
app\modules\v1\modules\root\controllers\UserController
我不确定这些选项中至少有一个是非常优雅的选择,也是Yii 2哲学的正确解决方案。
回到主要问题,Yii 2哲学解决这个问题的更合适的方法是什么?控制器和模块是两种不同类型的对象,它们是不同的复数或不同,因此应该是在所述情况的路由中将它们分开的正确方法。
答案 0 :(得分:0)
我不确定我是否能够完全理解这个问题,但您可能会问classname aliases?
use My\Full\Classname as Another;
答案 1 :(得分:0)
我通常如何处理这一点取决于我如何构建事物。
假设我有users
,departments
,orders
以及其他一些内容。所有这些概念都有自己的模块,可以在其中进行所有交互。如果我想为所有这些概念创建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
做了什么。没有歧义。