You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2配置SluggableBehavior与URLManager实现URL显示模型名称

没问题,我来一步步帮你搞定这个需求!在Yii框架里,要把example.com/item/view?id=1改成example.com/item/item-name,只需要配置好SluggableBehavior生成唯一的slug,再配合URL管理器的路由规则就行,分三步走:

第一步:配置SluggableBehavior生成友好的Slug

首先你需要在Item模型里配置SluggableBehavior,它会自动把商品名称(或你指定的字段)转换成符合URL规范的slug字符串,并存到数据库中。

先确保你的item数据表已经添加了一个slug字段,建议设为VARCHAR(255) NOT NULL UNIQUE,用来存储唯一的slug值。

然后在模型里添加行为配置:

use yii\behaviors\SluggableBehavior;

class Item extends \yii\db\ActiveRecord
{
    // ... 其他模型代码(比如rules、attributeLabels等)

    public function behaviors()
    {
        return array_merge(parent::behaviors(), [
            [
                'class' => SluggableBehavior::class,
                // 指定用来生成slug的源字段,比如你的商品名称字段是`name`
                'attribute' => 'name',
                // 指定存储slug的字段,就是我们刚才添加的`slug`
                'slugAttribute' => 'slug',
                // 开启唯一性校验,避免不同商品生成相同的slug
                'unique' => true,
                // 可选:当商品名称更新时,是否自动更新slug
                'updateSlugOnUpdate' => true,
                // 可选:自定义slug生成规则,默认已处理大部分特殊字符
                // 'slugGenerator' => function($slugParts) {
                //     return strtolower(implode('-', $slugParts));
                // },
            ],
        ]);
    }
}

以后创建或更新商品时,框架会自动生成并保存对应的slug值。

第二步:配置URLManager实现友好路由

接下来修改URL管理器的规则,让example.com/item/item-name格式的URL能正确路由到item/view动作。

打开应用配置文件(一般是config/web.php),找到components下的urlManager,配置如下:

'components' => [
    // ... 其他组件配置
    'urlManager' => [
        'enablePrettyUrl' => true, // 开启友好URL模式
        'showScriptName' => false, // 隐藏URL中的index.php
        'rules' => [
            // 核心路由规则:匹配item/xxx格式的URL,将xxx作为slug参数传给item/view
            ['pattern' => 'item/<slug:[\w-]+>', 'route' => 'item/view'],
            // 可选:如果需要兼容旧的?id=1格式URL,添加这条规则
            ['pattern' => 'item/view', 'route' => 'item/view', 'defaults' => ['id' => null]],
            // ... 其他路由规则
        ],
    ],
],
第三步:修改View动作的查询逻辑

最后调整ItemController里的actionView方法,把原来通过id查询模型的逻辑改成通过slug查询:

public function actionView($slug)
{
    $model = Item::findOne(['slug' => $slug]);
    
    if (!$model) {
        throw new \yii\web\NotFoundHttpException('该商品不存在');
    }
    
    return $this->render('view', [
        'model' => $model,
    ]);
}

这样就全部完成了!现在访问example.com/item/item-name就能正常打开对应的商品页面,SluggableBehavior会自动帮你维护slug的唯一性和更新。

内容的提问来源于stack exchange,提问作者Игорь Быстревский

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:05