whitecube / laravel-sluggable
自动为您的模型生成slug - 即使是带有翻译属性的情况
Requires
- php: ^8.0|^9.0
- illuminate/support: ^9.0|^10.0|^11.0
- laravel/helpers: ^1.1
Requires (Dev)
- orchestra/testbench: ^7.0|^8.0|^9.0
- spatie/laravel-translatable: ^6.3
README
一个特质,用于在模型上使用,根据另一个属性的值生成slug。支持翻译属性(使用 spatie/laravel-translatable)。
安装
您可以通过composer安装此包
composer require whitecube/laravel-sluggable
使用
namespace App; use Whitecube\Sluggable\HasSlug; class Post extends Model { use HasSlug; public $sluggable = 'title'; }
更改slug存储属性
默认情况下,slug配置为存储在名为slug
的属性中。您可以通过在模型上设置public $slugStorageAttribute
属性来覆盖此设置。
namespace App; use Whitecube\Sluggable\HasSlug; class Post extends Model { use HasSlug; public $sluggable = 'title'; public $slugStorageAttribute = 'custom-slug-column'; }
条件sluggable属性
如果需要,您可以覆盖特质的getSluggable()
方法,并在其中放置自己的sluggable属性选择逻辑
namespace App; use Whitecube\Sluggable\HasSlug; class Post extends Model { use HasSlug; /** * Get the attribute name used to generate the slug from * * @return string */ public function getSluggable() { return $this->title ? 'title' : 'author'; } }
翻译slug
您可以根据翻译属性(使用 spatie/laravel-translatable)生成slug。请记住将slug
属性添加到public $translatable
数组中,以便轻松访问它们。
namespace App; use Whitecube\Sluggable\HasSlug; use Spatie\Translatable\HasTranslations; class Post extends Model { use HasSlug; use HasTranslations; public $translatable = ['title', 'slug']; public $sluggable = 'title'; }
Post::create([ 'title' => [ 'en' => 'The title', 'fr' => 'Le titre' ] ]); $post->getAttributes()['slug']; // ['en' => 'the-title', 'fr' => 'le-titre'] $post->slug; // the-title (given that the crrent app locale is 'en') $post->translate('slug', 'fr'); // 'le-titre'
路由模型绑定
请注意,此包覆盖了getRouteKeyName
方法,这意味着 Laravel的路由模型绑定将默认使用slug属性(或您定义的$slugStorageAttribute
)。在大多数情况下,这是非常好的,可以为您节省一个步骤,并清理您的模型,但如果您必须,您可以将其更改为您喜欢的任何内容。
当使用路由模型绑定时,一些其他有趣的功能也变得可用。
自定义路由模型绑定查询
有时您可能希望向Laravel执行的查询添加自定义行为。此包通过在模型上定义一个getRouteBindingQuery
方法来使挂钩到查询成为可能,这在几个情况下可能很有用,例如包含软删除的结果。
namespace App; use Whitecube\Sluggable\HasSlug; class Post extends Model { use HasSlug; // ... protected function getRouteBindingQuery($query) { return $query->withTrashed(); } }
跨语言重定向
如果URL中提供的slug与当前区域设置的slug翻译不对应,但对应于另一种语言的slug,此包可以自动重定向到正确的slug。
例如:考虑到上述示例中的帖子,我们可以想象以下路由配置
/en/posts/the-title
/fr/articles/le-titre
但是,如果我们访问 /fr/articles/the-title
,则此包将自动执行301
重定向到/fr/articles/le-titre
。
此行为可以通过在模型上设置public $slugTranslationRedirect = false;
来禁用,在这种情况下,访问/fr/articles/the-title
将仅渲染404
页面。
翻译URL生成器
您需要为翻译的sluggable模型生成替代区域链接吗?我们为您解决了这个问题。请查看getSluggedUrlForRoute($route, $locale, $fullUrl)
。
$post = Post::create([ 'title' => [ 'en' => 'The title in English', 'fr' => 'Le titre en Français' ] ]); $alternates = []; foreach (['en', 'fr'] as $locale) { $alternates[] = $post->getSluggedUrlForRoute(Route::current(), $locale); }
考虑到当前路由为/blog/{post}/{tab}
,请求参数为{tab} = 'comments'
,结果将是
/blog/the-title-in-english/comments
/blog/le-titre-en-francais/comments
💖 赞助
如果您在生产应用中依赖于此包,请考虑 赞助我们!这是帮助我们继续做我们热爱的事情的最佳方式:制作优秀的开源软件。
贡献
请随意提出更改建议,请求新功能或自行修复错误。我们确信还有许多可以改进的地方,我们非常愿意合并有用的拉取请求。
谢谢!
用❤️为开源制作
在Whitecube,我们日常工作中大量使用开源软件。因此,当我们有机会回馈的时候,我们感到非常激动!
我们希望您会喜欢我们提供的这个小贡献,如果您在项目中觉得它有用,我们非常愿意听到您的反馈。关注我们的Twitter,获取更多更新!