如何使用Yii2 Sluggable Behavior?

时间:2015-03-03 18:36:41

标签: php url routing yii2 slug

我已根据文档说明定义了此行为。

public function behaviors()
{
    return [
        TimestampBehavior::className(),
        [
            'class' => SluggableBehavior::className(),
            'attribute' => 'title',
        ],
    ];
}

在我的配置网址管理器中,我已经定义了这样的自定义规则:example.com/article/1

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'article/<id:\d+>/<slug>' => 'article/view',
    ],
],

我的观点操作是:

public function actionView($id, $slug = null)
{
    return $this->render('view', [
        'model' => $this->findModel($id),
    ]);
}

在我的索引视图文件中,我生成了一个URL来查看这样的操作:Url::to(['article/view', 'id' => $model->id, 'slug' => $model->slug])

我想在网址中输出我的文章标题:example.com/article/1/My-first-post

但我没有在网址中获得头衔。

Soju说slug是一个数据库属性。我在我的文章表中创建了一个名为slug的新列,它是varchar 1024.但我仍然没有在URL中生成slug。我的网址是:example.com/article/1

有什么问题?感谢

编辑:我已更新我的代码,将标题值插入我的文章表格中的slug列。现在我得到slug工作,但我没有得到SEO URL-s。我明白这个:article/1/First+Article,我希望article/1/First-Article

我尝试过:

return [
    TimestampBehavior::className(),
    [
        'class' => SluggableBehavior::className(),
        'attribute' => 'title',
        'value' => function ($event) {
            return str_replace(' ', '-', $this->slug);
        }
    ],
];

这也不起作用:return str_replace(' ', '-', $this->slug);

1 个答案:

答案 0 :(得分:4)

您可以添加以下urlManager规则:

'article/<id:\d+>/<slug>' => 'article/view',

在您的观看中构建网址:

\yii\helpers\Url::to(['article/view', 'id'=>$model->id, 'slug'=>$model->slug])

您还可以在模型中添加帮助器:

public function getRoute()
{
    return ['article/view', 'id'=>$this->id, 'slug'=>$this->slug];
}

public function getUrl()
{
    return \yii\helpers\Url::to($this->getRoute());
}

然后只在视图中使用$model->url