motomedialab / laravel-self-healing-urls
为模型生成自修复URL
Requires
- php: ^8.1
- illuminate/database: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- laravel/pint: ^1.13
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^v8.15.0
- phpunit/phpunit: ^10.4.2
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)。请参阅许可证文件以获取更多信息。