Yii2-了解urlManager

时间:2018-07-22 00:50:25

标签: yii2 yii2-basic-app yii2-urlmanager

我有以下可能的网址:

开始时有国家/地区:

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个过程:

  1. 在浏览器上写URL时。在这种情况下,Yii尝试将该网址转换为路线和参数。

  2. 例如,当使用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

问题:

  1. 在我的规则中,我认为它与诸如,的预定义变量冲突。我曾尝试更改它,但仍然是同样的问题。

  2. 在国家/地区中,我必须添加可能的选项:秘鲁,法国才能使其正常运行,如果不奏效,那么在没有这些选项的情况下如何使其能够正常工作?

  3. URL匹配取决于查询参数的数量,还是也算控制器和操作?

  4. 在创建url时如何使规则的空参数被忽略?

  5. 为什么要在URL中添加控制器?

  6. 规则顺序正确吗?

2 个答案:

答案 0 :(得分:0)

我想我找到了解决所有问题的方法:

  1. 到目前为止,我还没有找到规则的预定义关键字:<controller><action><module>只是变量的名称,如果有人知道不同的内容,请告诉我。

  2. 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”作为值,则它将不匹配第一个规则,因此它将使用第二个规则。

  3. 已回答上方。

  4. 忽略空参数,我们可以在规则中使用+代替*,这样空参数将不匹配。

  5. 删除控制器,我们需要在最后添加一条规则:

    '' => 'site/index'
    
  6. 问题排序,它应该从具有最多参数的规则开始,然后在该组内将它们从较不通用的规则排序为较通用的规则。

最后,我的规则是:

'<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']);