mcris112 / laravel-hashidable
LaravelHashidable - 为 Laravel 模型和路由提供 Hashids 功能
V1.3.2
2023-11-09 15:36 UTC
Requires
- php: >=8.0
- hashids/hashids: ^4.0
Requires (Dev)
- orchestra/database: ^5.1
- orchestra/testbench: ^5.3
- phpunit/phpunit: ^9.2
This package is auto-updated.
Last update: 2024-09-09 17:25:42 UTC
README
Laravel Hashidable 使用 Hashidable 作为主要源
我制作这个包是因为上面的主要包从未更新过,存在类型声明错误,当你想使用 User::whereHashid()
安装
注意:此包旨在与 Laravel 7 以上版本一起使用。它可能在旧版本中工作,但尚未进行测试。
composer require mcris112/laravel-hashidable
设置
导入 Hashidable 特性并将其添加到您的模型中。
use Mcris112\LaravelHashidable\Hashidable; Class User extends Model { use Hashidable; }
使用
$user = User::find(1); $user->id; // 1 $user->hashid; // 3RwQaeoOR1E7qjYy User::find(1); // User::findByHashId( string|array $hashId, array $columns ); Returns a model or a collection of models User::findByHashId('3RwQaeoOR1E7qjYy'); User::findByHashidOrFail('3RwQaeoOR1E7qjYy'); User::whereHashid('3RwQaeoOR1E7qjYy')->first(); User::hashIdDecode('3RwQaeoOR1E7qjYy'); //Returns the hash decoded, User::hashIdDecode(['3RwQaeoOR1E7qjYy', ...$hashes]); //This also can be as array
WhereHashid
此函数需要两个参数。
$hashid 需要是一个 字符串,代表一个纯哈希ID文本,$columnId 需要是一个 字符串,如果您的主键与之不同
User::whereHashid( string $hashid , string $columnId = 'id' )->first(); //Example public function show(string $userId, Request $request) { // ... $user = User::whereHashid($userId)->where('is_email_verified', true)->first(); // ... }
路由模型绑定
假设我们有一个如下定义的路由资源
Route::apiResource('users', UserController::class);
此包不会影响路由模型绑定,唯一的不同之处在于,它使用哈希ID而不是ID放置在生成的路由中。
因此,route('users.show', $user) 返回 /users/3RwQaeoOR1E7qjYy;
当你定义控制器自动解析参数中的模型时,它将始终按预期工作。
public function show(Request $request, User $user) { return $user; // Works just fine }
配置
首先,使用以下命令发布配置文件
php artisan vendor:publish --tag=hashidable.config
可用的配置选项包括
return [ /** * Length of the generated hashid. */ 'length' => 16, /** * Character set used to generate the hashids. */ 'charset' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', /** * Prefix attached to the generated hash. */ 'prefix' => '', /** * Suffix attached to the generated hash. */ 'suffix' => '', /** * If a prefix of suffix is defined, we use this as a separator * between the prefix/suffix. */ 'separator' => '-', ];
模型配置
你还可以在模型级别扩展全局配置。为此,你的模型应该实现 Mcris112\LaravelHashidable\HashidableConfigInterface 并在模型上定义 hashidableConfig() 方法。
此方法返回一个数组或类似全局配置的选项子集。
public function hashidableConfig() { return ['prefix' => 'app']; }
常见问题解答
生成的哈希存储在哪里?
Hashidable 不会接触数据库以存储任何类型的元数据。它所做的是使用内部编码器/解码器动态计算哈希。