adamhopkinson / laravel-model-hash
一个特质,可以自动为每个模型实例生成一个唯一的哈希值
Requires (Dev)
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^9.2
- vimeo/psalm: ^3.12
This package is auto-updated.
Last update: 2024-09-19 04:53:40 UTC
README
自动为您的Laravel模型创建短哈希值,自动在URL中使用它们,并回填现有模型。
为什么?
例如 stackoverflow.com/users/12280 这样的URL中的数据库ID从未让我感到满意
- 拥有实体的索引可以估计网站的大小和增长
- 访问不应该被访问的东西只需要一个粗心的开发者和一个好奇的访客
但与此同时,我不想完全用UUID替换数据库ID,就像一些包所做的那样——因为我担心这可能会影响性能。
laravel-model-hash 允许您在创建项目时生成一个短随机哈希值,同时仍然使用自动递增的ID进行数据库关系。
它的工作原理
此包提供了一种特质,当附加到模型时,在创建模型的新实例时会创建一个随机字符串哈希值。
哈希值是通过随机打乱一个 字母表,取前 长度 个字符,并在数据库中检查唯一性(最多尝试次数)来创建的。如果在 最大尝试次数 内未找到唯一的哈希值,将抛出类型为 UniqueHashNotFoundException
的异常,并且不会保存模型实例。
此包可以通过配置文件全局配置,也可以通过定义特定于模型的属性来配置。
安装
您可以通过Composer安装此包
composer require adamhopkinson/laravel-model-hash
如果您想调整任何包配置,您必须首先发布配置文件
php artisan vendor:publish --provider="AdamHopkinson\LaravelModelHash\LaravelModelHashServiceProvider"
用法
要将哈希值添加到模型,请添加 LaravelModelHash
特质
use AdamHopkinson\LaravelModelHash\Traits\ModelHash;
class MyModel extends Model
{
use ModelHash;
//...
}
并创建一个迁移来添加一个存储哈希值的字段 - 默认情况下,字段名为 hash
,长度为5
$table->string('hash', 5)->unique()->index();
您可以为数据库性能改进添加唯一和索引标志。如果您正在将此特质添加到现有模型,您需要使用 nullable()
直到所有记录都有哈希值。
现在,当创建模型的新实例时,它们将分配一个随机字符串。
将哈希值添加到现有模型
如果您要将此包添加到现有安装,有一个 artisan 命令用于“回填”现有模型。语法是
php artisan laravelmodelhash:populate
这使用反射来查找所有扩展了 ModelHash
特质的模型(在 app_path()
中),并为当前哈希值为 null
的任何记录添加哈希值。
如果您只想为特定模型运行此操作,请使用 --model
(或 -M
)选项——但请记住要使用双斜杠命名空间
php artisan laravelmodelhash:populate --model \\App\\MyModel
配置
哈希值有三个可配置部分
- 使用的字母表(即允许的字符集)
- 哈希字段的名称
- 哈希的长度
还有两个其他配置属性
- 在抛出异常之前尝试在数据库中找到唯一哈希值的最大次数
- 是否自动在路由模型绑定中使用哈希值
这些都在默认配置中设置,可以在 /config/laravelmodelhash.php
中覆盖(这必须首先发布——有关详细信息,请参阅安装部分)。
如果您想按模型更改这些设置,可以通过添加以下模型属性进行更改:
protected $hashName; // string
protected $hashLength; // int
protected $hashAlphabet; // string
protected $hashMaximumAttempts; // int
protected $useHashInRoutes; // boolean
谢谢
多亏了以下内容,我才能走到这一步
- John Braun 和他关于 Laravel 包开发 的优秀指南
- Jeff Way,他因 Laracasts 而闻名
- 令人惊叹的 Laravel 社区