我有以下条件:
1)预期请求是/a1,a2,aN[/.../n1,n2,nN][?range=xxx-yyyy[&search=string]]
(方括号包含可选部分)
2)动作方法签名是 public function actionIndex(string $alias = '', string $range = '', string $search = ''): string
3)所以我为此使用了一个规则:
[
'pattern' => '<alias:[\\w-,\\/]+>',
'route' => 'shop/products/index',
'encodeParams' => false,
],
它工作正常,直到我尝试添加分页,LinkPager
忽略我写的规则:
[
'pattern' => '<alias:[\\w-,\\/]+>/<page:\d+>',
'route' => 'shop/products/index',
'encodeParams' => false,
],
并将alias
和page
params显示为 GET 变量。
在请求 URI 的末尾添加页码/a1,a2,aN/n1,n2,nN/2
并忽略页码是否为 1 的正确规则是什么?
UPD:我找到了一个原因,这是我之前定义的规则:
'/shop' => 'shop/products/index', //it breaks following rules
[
'pattern' => '<alias:[\\w-,\\/]+>/<page:\d+>',
'route' => 'shop/products/index',
'encodeParams' => false,
],
[
'pattern' => '<alias:[\\w-,\\/]+>',
'route' => 'shop/products/index',
'encodeParams' => false,
],
那么,我如何使所有这些规则协同工作?
解决方案1:制作另一种无需alias
参数即可工作并actionIndex
以空方法调用的动作方法。
解决方案2:以mode
特殊顺序制定不同的相同规则:
[
'name' => 'This rule is first when we create a link',
'pattern' => '<alias:[\\w-,\\/]+>/<page:\d+>',
'route' => 'shop/products/index',
'encodeParams' => false,
'mode' => \yii\web\UrlRule::CREATION_ONLY,
],
[
'name' => 'This rule is first when we parse a request',
//
'pattern' => 'shop/<page:\d+>',
'route' => 'shop/products/index',
],
[
'name' => 'Used for parsing when previous rule does not match',
'pattern' => '<alias:[\\w-,\\/]+>/<page:\d+>',
'route' => 'shop/products/index',
'encodeParams' => false,
'mode' => \yii\web\UrlRule::PARSING_ONLY,
],
[
'name' => 'Same as first but when link has no page number',
'pattern' => '<alias:[\\w-,\\/]+>',
'route' => 'shop/products/index',
'encodeParams' => false,
'mode' => \yii\web\UrlRule::CREATION_ONLY,
],
[
'name' => 'First when parsing request with no page number',
'pattern' => 'shop',
'route' => 'shop/products/index',
],
[
'name' => 'Used for parsing when previous rule does not match',
'pattern' => '<alias:[\\w-,\\/]+>',
'route' => 'shop/products/index',
'encodeParams' => false,
'mode' => \yii\web\UrlRule::PARSING_ONLY,
],
如果你知道一个更好的解决方案,我会很高兴看到它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句