whitecube/laravel-sluggable

自动为您的模型生成slug - 即使是带有翻译属性的情况

v1.6.7 2024-04-27 15:29 UTC

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,获取更多更新!