lukeraymonddowning/self-healing-urls

v0.6.0 2024-09-19 15:27 UTC

This package is auto-updated.

Last update: 2024-09-19 15:28:57 UTC


README

Self Healing URLs 是一个简单的 Laravel 扩展包,灵感来源于Aaron Francis 的这个视频

它允许您将 Eloquent 模型标记为自修复,以便为这些模型生成的 URL 可以包含 SEO 友好的别名,即使别名有任何变化也不会中断。

安装

可以通过 Composer 安装此包

composer require lukeraymonddowning/self-healing-urls

安装完成后,将 HasSelfHealingUrls 特性添加到任何 Eloquent 模型中

use Lukeraymonddowning\SelfHealingUrls\Concerns\HasSelfHealingUrls;

class Post extends Model
{
    use HasSelfHealingUrls;
}

如果您的模型有一个名为 slug 的列,那么您已经设置好了。否则,在您的模型中定义一个 $slug 属性,以告知包使用哪个列

use Lukeraymonddowning\SelfHealingUrls\Concerns\HasSelfHealingUrls;

class Post extends Model
{
    use HasSelfHealingUrls;
    
    protected $slug = 'title';
}

不用担心您的 "slug" 是否是 URL 友好的;包会帮您处理格式化。实际上,它甚至不需要是唯一的,因为您的模型定义的唯一标识符也将包含在末尾。

限制

默认情况下,该包要求您的唯一标识符(如 iduuid 列)不包含任何 - 字符。您可以在下一节中详细了解如何实现自己的 IdentifierHandler

除非您实现自定义 Rerouter,否则该包要求您已为要使用的自修复 URL 定义了路由名称。

使用自定义 IdentifierHandler

如果您需要自定义别名与模型标识符(默认情况下是连字符)的连接方式,您可以创建自己的类实现 IdentifierHandler 并在 AppServiceProvider 的 register 方法中注册它。

以下是一个使用 _ 而不是连字符的示例

class UnderscoreIdentifierHandler implements IdentifierHandler
{
    public function joinToSlug(string $slug, string|int $identifier): string
    {
        return "{$slug}_{$identifier}";
    }

    public function separateFromSlug(string $value): string
    {
        return Str::afterLast($value, '_');
    }
}

如下所示在您的 AppServiceProvider 中注册自定义处理器

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->singleton(IdentifierHandler::class, UnderscoreIdentifierHandler::class);
    }
}

致谢

如果没有 Aaron 的视频,我甚至不会考虑这一点,所以向他致敬。去看看这个视频。