我有以下可能的网址:
开始时有国家/地区:
peru/blog/search/my-search
peru/blog/tag/my-tag
peru/blog/my-blog-post
peru/blog/
peru/
开头没有国家/地区:
blog/search/my-search
blog/tag/my-tag
blog/my-blog-post
blog/
/
工作方式:
据我了解,URL管理有2个过程:
在浏览器上写URL时。在这种情况下,Yii尝试将该网址转换为路线和参数。
例如,当使用Yii :: $ app-> urlManager-> createAbsoluteUrl创建URL时。
根据这些,我在urlManager中编写了一些规则,首先是常规配置:
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => []
]
现在规则:
'<country:peru|france>/<module:[\w\-]+>/tag/<tag:[\w\-]*>' => '<module>/index',
'<country:peru|france>/<module:[\w\-]+>/search/<search:[\w\-]*>' => '<module>/index',
'<country:peru|france>/<module:[\w\-]+>/<slug:[\w\-]*>' => '<module>/index',
'<country:peru|france>/<module:[\w\-]+>' => '<module>/index',
'<module:[\w\-]+>/tag/<tag:[\w\-]*>' => '<module>/index',
'<module:[\w\-]+>/search/<search:[\w\-]*>' => '<module>/index',
'<module:[\w\-]+>/<slug:[\w\-]*>' => '<module>/index',
'<module:[\w\-]+>' => '<module>/index',
正如您从规则中注意到的那样,我在网址中传递了一个参数“模块”,我希望该参数可以用作控制器。
对于国家/地区,我必须添加一些可能的匹配项,否则,我将无法使其正常工作。
使用上述规则,当我在浏览器中输入“漂亮”网址时,它就可以工作:
http://example.com/blog/search/my-search
但是我的问题开始了,如果尝试创建URL:
Yii::$app->urlManager->createAbsoluteUrl(["blog/index", "module" => "blog"]
Rule: '<module:[\w\-]+>' => '<module>/index'
Url Expected: http://example.com/blog
Url Generated: http://example.com/blog?module=blog
不确定,这似乎不符合规则。
如果我尝试创建网址:
Yii::$app->urlManager->createAbsoluteUrl(['blog/index', 'module' => 'blog', 'slug' => 'my-post'])
Rule: '<module:[\w\-]+>/<slug:[\w\-]*>' => '<module>/index'
Url Expected: http://example.com/blog/my-post
Url Generated: http://example.com/blog/my-post?module=blog
在这两种情况下,我注意到它正在将控制器添加到url
问题:
在我的规则中,我认为它与诸如,的预定义变量冲突。我曾尝试更改它,但仍然是同样的问题。
在国家/地区中,我必须添加可能的选项:秘鲁,法国才能使其正常运行,如果不奏效,那么在没有这些选项的情况下如何使其能够正常工作?
URL匹配取决于查询参数的数量,还是也算控制器和操作?
在创建url时如何使规则的空参数被忽略?
为什么要在URL中添加控制器?
规则顺序正确吗?
答案 0 :(得分:0)
我想我找到了解决所有问题的方法:
到目前为止,我还没有找到规则的预定义关键字:<controller>
,<action>
,<module>
只是变量的名称,如果有人知道不同的内容,请告诉我。
Yii URL管理器(可能还有任何URL管理器)只能匹配我们发送的参数数量,并与规则(而不是变量名称)进行匹配,因此,如果我们发送:
Yii仅了解我们正在发送一个参数,因此如果在规则中,我们具有:
'<language:[\w\-]*>' => 'language/index'
'<country:[\w\-]*>' => 'country/index'
Yii将使用第一个匹配的规则,因此在这种情况下将是<language>
匹配的规则。然后Yii将以“ peru”作为值的变量$language
传递给LanguageControlle
,这是错误的。
因此,为了帮助Yii,我们必须添加模式以帮助其使用正确的规则,我们可以添加模式以仅匹配任何2个字符的值或特定值列表,例如:
<language:es|en> => 'language/index'
<country:[\w\-]*> => 'country/index'
在这种情况下,如果我们将“ peru”作为值,则它将不匹配第一个规则,因此它将使用第二个规则。
已回答上方。
忽略空参数,我们可以在规则中使用+代替*,这样空参数将不匹配。
删除控制器,我们需要在最后添加一条规则:
'' => 'site/index'
问题排序,它应该从具有最多参数的规则开始,然后在该组内将它们从较不通用的规则排序为较通用的规则。
最后,我的规则是:
'<base:es|en>/<module:ideas|user|blog>/tag/<tag:[\w\-]*>' => '<module>/index',
'<base:es|en>/<module:ideas|user|blog>/search/<search:[\w\-]*>' => '<module>/index',
'<base:es|en>/<module:ideas|user|blog>/<slug:[\w\-]*>' => '<module>/index',
'<base:es|en>/<module:ideas|user|blog>' => '<module>/index',
'<base:es|en>/<slug:contact>' => 'site/index',
'<base:es|en>' => 'site/index',
'<module:ideas|user|blog>/tag/<tag:[\w\-]*>' => '<module>/index',
'<module:ideas|user|blog>/search/<search:[\w\-]*>' => '<module>/index',
'<module:ideas|user|blog>/<slug:[\w\-]*>' => '<module>/index',
'<module:ideas|user|blog>' => '<module>/index',
'<slug:contact>' => 'site/index',
'' => 'site/index',
我希望这样可以节省以后的时间。
答案 1 :(得分:0)
问题是如何创建URL。如果<module>
在路由模式中可用(规则数组中的值),则无需手动传递。将从路径中检测到。
您应该这样创建您的网址:
Yii::$app->urlManager->createAbsoluteUrl(['blog/index', 'slug' => 'my-post'])
Yii::$app->urlManager->createAbsoluteUrl(['blog/index']);