motomedialab/laravel-self-healing-urls

为模型生成自修复URL

v1.0.3 2024-03-08 17:25 UTC

This package is auto-updated.

Last update: 2024-09-08 18:31:08 UTC


README

本包受YouTube上的Aaron Francis的启发[链接](https://www.youtube.com/watch?v=a6lnfyES-LA) - 感谢Aaron!这个轻量级的包允许您创建能够自修复的URL,无论提供的slug是什么。

这对SEO很有帮助,您可以更改slug而不用担心,并且将强制进行301重定向到正确的URL。

这种技术通常用于像Amazon和Medium这样的知名网站,允许slug更改而不会破坏实际的URL。

例如,访问https://your-site.com/posts/old-slug-12345会自动重定向到https://your-site.com/posts/new-slug-12345。它是根据slug末尾持久化的唯一ID来做到这一点的。

这利用了Laravel现有的路由模型绑定。

安装

您可以通过composer安装此包

composer require motomedialab/laravel-self-healing-urls

用法

要使用此包,只需安装它,将提供的特质应用到您的模型上,并告诉特质模型slug的位置。

以下示例中,我使用了Post模型,但这实际上可以应用到任何您喜欢的模型上。

<?php

namespace App\Models;

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;
use MotoMediaLab\LaravelSelfHealingUrls\HasSelfHealingUrl;

class Post extends Model {

    use HasSelfHealingUrl;
    
    public function getRouteBindingSlug(): string
    {
        return Str::slug($this->title);
    }

}

完成此操作后,您还需要在迁移中添加另一列。该列将存储用于URL中的唯一值。

我添加了一个助手来实现这一点

<?php

use App\Models\Post;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('posts', function (Blueprint $table) {
            Post::selfHealingUrlMigration($table);
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('posts', function (Blueprint $table) {
            Post::selfHealingUrlMigration($table, true);
        });
    }
};

扩展

虽然以上内容可以帮您入门,但通过覆盖特质的默认方法,此包具有高度的可扩展性。以下是一些示例:

覆盖存储在数据库中的绑定列名称
public function getRouteBindingKeyName(): string
{
    return 'new_binding_key';
}

注意:更改此键后,您需要重新运行迁移。

覆盖唯一ID的生成方式
public function getRouteBindingKey(): string
{
    return Str::random(4); // generate random four character binding key
}

默认情况下,唯一ID是使用PHP的uniqid函数确定的。无论如何,在模型创建时,它将自动尝试设置一个唯一ID,并通过生成最多三次来自动避免冲突。如果在三次尝试后无法生成唯一密钥,将抛出异常。

更新确定模型绝对URL的方式(我建议这样做)
public function getModelUrl(): string
{
    return route('posts.show', $this);
}

默认情况下,因为我不知道您的路由结构,它尝试根据匹配的路由名称重新创建绝对URL。如果没有匹配的路由存在,则重定向将失败,并且应该覆盖此方法。

安全

如果您发现任何安全相关的问题,请通过电子邮件technical@motocom.co.uk联系,而不是使用问题跟踪器。

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。