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,提问作者Игорь Быстревский
相关产品推荐
相关产品推荐

