如何在不显示 ID 号的情况下使用 Yii2 Sluggable Behavior?

Posted

技术标签:

【中文标题】如何在不显示 ID 号的情况下使用 Yii2 Sluggable Behavior?【英文标题】:How to use Yii2 Sluggable Behavior without showing id number? 【发布时间】:2020-08-09 02:04:36 【问题描述】:

我已经阅读了using SluggableBehavior in Yii2 上的问题

在我的试用案例中,我可以使用 urlManager 中的规则生成类似 article/1/First-Article 的 url

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

并使用

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

创建网址。

在我的真实案例中,我使用 ['article/view', 'hash'=> $model->hash, 'slug'=>$model->slug] 来生成 url。我的规则是

'article/<hash:[\d-\w]+>/<slug>'=>'article/view'

我的网址类似于 article/1e482d69129d760e9494b2c6e86eba2b/First-Article。

我只想显示文章/First-Article 之类的 url,即不显示 url 中的哈希码。有没有办法做到这一点?非常感谢!

【问题讨论】:

【参考方案1】:

根据Yii docs,如果您指定SluggableBehaviorattribute 属性与模型属性的数组,它将内爆(连接)它们以便为slug 生成唯一性.在您的情况下,此实现完全满足您所需的 slug 连接组合(例如First-Article-1);

在内部SluggableBehavior 将执行它的generateSlug 方法,从attribute 属性中定义的属性组合生成唯一的slug。 由于generateSlug 默认使用- 分隔符,它完全符合您的要求,以便生成所需的url slug。

看看这个:

public function behaviors() 
   
     return [
         [
             'class' => SluggableBehavior::className(),
             'attribute' => ['slug', 'id'],
             ...
         ]
     ];

编辑:

这是您的网址规则:'article/&lt;slug&gt;' =&gt; 'article/view'

生成适当的链接:Url::to(['article', 'slug' =&gt; $model-&gt;slug . '-' . $model-&gt;id])

【讨论】:

谢谢 G.Spirov。但是我遇到的问题是我无法生成没有 id 的 url。我只能生成article/1/First-Article,但不能生成article/First-Article。你知道如何实现这一点吗? 谢谢。但我很难尝试你的代码。我将重写我的问题以使其更清楚。 是什么让它变得困难?我可以帮你吗? 是的。你能阅读修改后的问题吗?非常感谢:) 恐怕您无法做到这一点,因为正如您之前指出的那样,您可能有 1 个或多个具有相同标题的模型,基本上您应该保证不同文章之间的唯一性。这就是为什么SlugableBehaviorattribute 属性可以定义为字符串或数组,以便在多个 模型属性之间应用组合的唯一性。

以上是关于如何在不显示 ID 号的情况下使用 Yii2 Sluggable Behavior?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用滞后的情况下在偏移量旁边显示一列值

在不更改版本号的情况下更新 android 应用

如何在不使用pivot和unpivot的情况下在SQL Server中水平显示数据?

如何在不使用相同音频 ID 的情况下播放从数据库中获取的多个音频文件

Maxscript netrender 文件名 - 尝试在不附加帧号的情况下保存

如何在不破坏内部绑定的情况下从外部初始化自定义项的属性?