lukeraymonddowning / self-healing-urls
v0.6.0
2024-09-19 15:27 UTC
Requires
- php: ^8.1|^8.2
- laravel/framework: ^10.0|^11.0
Requires (Dev)
- laravel/pint: ^1.13
- orchestra/testbench: ^8.15|^9.0
- pestphp/pest: ^2.25
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 友好的;包会帮您处理格式化。实际上,它甚至不需要是唯一的,因为您的模型定义的唯一标识符也将包含在末尾。
限制
默认情况下,该包要求您的唯一标识符(如 id
或 uuid
列)不包含任何 -
字符。您可以在下一节中详细了解如何实现自己的 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 的视频,我甚至不会考虑这一点,所以向他致敬。去看看这个视频。