Yii2:使用urlManager用值替换querystring参数

时间:2018-02-06 16:06:30

标签: yii2

我在urlManager中有一条规则

    'rules' => [
        'products/<whatever:[-_0-9a-zA-Z]+>' => 'products/show',
    ],

我有控制器产品和actionShow()

public function actionShow($name)
{
    var_dump($name);
    echo 'actionShow is work';
}

但是有错误:错误请求(#400)缺少必需参数:名称

如何将产品的$ name传输到控制器,或者如何从控制器中的URL获取?

2 个答案:

答案 0 :(得分:1)

我猜您应该在规则中指定变量的名称。您将其称为whatever,将其更改为name

'rules' => [
        'products/<name:[-_0-9a-zA-Z]+>' => 'products/show',
    ],

答案 1 :(得分:1)

CORRECT and COMPLETE 答案是您必须使用下面的rule

'rules' => [
        'products/<name:[\-\w]+>' => 'products/show',
],

然后在您的产品控制器中,您不再需要在参数中传递$name,这就是我们在规则中定义的原因,您必须使用 Yii::$app->request->queryParams['name'];Yii::$app->request->get('name')获取产品名称,您的操作将如下所示

public function actionShow()
{
   echo Yii::$app->request->get('name');
}

完成上述所有设置后,打开浏览器并输入

<强> http://yourdomain.com/products/some-product

它会告诉你

<强> some-product

当你必须创建一个指向该页面的链接时,我们可以在products列出所有产品的菜单中,你必须为所有产品创建一个指向详细信息页面的链接,即actionShow你会就像下面这样。

<?=Html::a($model->name, 
    Yii::$app->urlManager->createUrl([
        'products/show',
        'name'=>$model->slug
    ])
  );
?>