我有一个Yii 2应用程序,我想使用一些漂亮的URL。在我的配置文件中,我已经使用以下规则启用了漂亮的URL:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
//'suffix' => '.html',
'rules' => [
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>/<slug>',
'<controller:[\w\-]+>/<action:[\w\-]+>/slug/<slug:\d+>/id/<id:\w+>/itmNo/<itmNo:\w+>' => '<controller>/<action>/<slug>',
],
],
URL结果类似http://192.168.1.101/myproject/item?Id=mens-body-fitted-t-shirt-2018-summer-fashion-2&itmNo=82813720
在上面的URL item
中是控制器,而在Id
和itmNO
是查询中,我想在URL http://192.168.1.101/myproject/item/mens-body-fitted-t-shirt-2018-summer-fashion-2/82813720
下得到类似的内容
查询名称替换为/
。如何在Yii2中执行此操作,并且仍在控制器中获取查询以进行常规搜索?
我的网址创建看起来像这样
$myurl = \Yii::$app->UrlManager->createUrl(['/item','Id'=>$items['slug'].'-'.$items['product_id'],'itmNo'=>$items['item_number']]);
答案 0 :(得分:0)
您需要在开始时放置最精确的规则:
'rules' => [
'<controller:[\w\-]+>/<action:[\w\-]+>/slug/<slug:\d+>/id/<id:\w+>/itmNo/<itmNo:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
],
并创建如下网址:
$myurl = \Yii::$app->UrlManager->createUrl([
'/item/view',
'id' => $items['product_id'],
'slug' => $items['slug'],
'itmNo' => $items['item_number'],
]);
答案 1 :(得分:0)
我认为,您要寻找的是以下规则:
> '<controller:[\w\-]+>/<action:[\w\-]+>/<id:[\w\-]+>/<itmNo:\w+>'=>'<controller>/<action>'
在这种情况下,您应该指定控制器名称,id和itmNo作为参数。别忘了将此规则放在更通用的规则之前。 查询示例:
\Yii::$app->UrlManager->createUrl(['item/view','id'=>'slug'.'-'.'2', 'itmNo'=>'12313'])
阅读this post可以更好地理解