如何为Yii 2的apiv1模块配置/api/v1格式的路由?
解决Yii2 apiv1模块路由映射到/api/v1的问题
嘿,我来帮你搞定这个Yii2 REST路由的需求~ 你想要把GET /apiv1/likes的访问改成GET /api/v1/likes,有两种思路:要么给整个apiv1模块统一设置路由前缀,要么单独给likes控制器配置规则,下面分别说具体操作:
方案1:为整个apiv1模块统一配置/api/v1前缀
这种方式最省心,模块下所有控制器都能通过/api/v1/xxx访问,推荐用这个方法。
方法A:通过REST UrlRule的prefix属性直接设置
直接修改你现有的REST路由规则,加上prefix参数,同时明确指定模块下的控制器:
'urlManager' => [ // 记得确保enablePrettyUrl、showScriptName这些基础配置已经正确设置 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ [ 'class' => 'yii\rest\UrlRule', 'controller' => ['apiv1/likes'], // 这里要加上模块前缀apiv1/ 'prefix' => 'api/v1', // 设置新的路由前缀 // 可选:如果想保留原来的/apiv1/likes路由,把prefix改成数组 // 'prefix' => ['apiv1', 'api/v1'], ], ], ];
这样设置后,GET /api/v1/likes就可以正常访问了,如果用数组形式的prefix,原来的/apiv1/likes也会保留生效。
方法B:添加通用模块路由规则
如果你的apiv1模块下有多个控制器,不想逐个配置REST规则,可以加一条通用规则,把所有/api/v1/*的请求都转发到apiv1模块:
'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'rules' => [ // 匹配api/v1下的所有列表、详情、自定义动作请求 'api/v1/<controller:\w+>' => 'apiv1/<controller>', 'api/v1/<controller:\w+>/<id:\d+>' => 'apiv1/<controller>/view', 'api/v1/<controller:\w+>/<action:\w+>' => 'apiv1/<controller>/<action>', // 保留原来的apiv1路由(可选) [ 'class' => 'yii\rest\UrlRule', 'controller' => ['likes'], 'prefix' => 'apiv1', ], ], ];
这个方法能一次性搞定模块下所有控制器的路由映射,不用重复配置。
方案2:单独为likes控制器配置/api/v1/likes路由
如果只需要给likes控制器设置新路由,不影响模块其他控制器,可以单独加一条REST规则:
'urlManager' => [ 'rules' => [ // 新的api/v1/likes路由 [ 'class' => 'yii\rest\UrlRule', 'controller' => ['apiv1/likes'], 'prefix' => 'api/v1', ], // 原来的apiv1/likes路由(可选保留) [ 'class' => 'yii\rest\UrlRule', 'controller' => ['likes'], 'prefix' => 'apiv1', ], ], ];
几个重要注意点
- 一定要确保
urlManager的enablePrettyUrl设为true,showScriptName设为false,否则漂亮路由不会生效。 - 如果开启了
enableStrictParsing,要保证所有请求都能匹配到对应的规则,不然会返回404。 - 控制器名称要写对,
apiv1/likes对应的是apiv1模块下的LikesController类。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

