pacificinternet / laravel-hashslug
提供在模型上使用Hashids特性的包
Requires
- hashids/hashids: ^3.0|^4.0|^5.0
- illuminate/database: 5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0|^9.0|^10.0
- illuminate/routing: 5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0|^9.0|^10.0
Requires (Dev)
- orchestra/testbench: 3.5.*|3.6.*|3.7.*|3.8.*|^4.0|^5.0|^6.0|^7.0|^8.0
- phpunit/phpunit: ^6.3|^7.0|^8.0|^9.0|^10.0
This package is auto-updated.
Last update: 2024-09-17 10:44:21 UTC
README
从https://gitlab.com/balping/laravel-hashslug v2.2.4分叉
此包可用于使用Hashids在URL中隐藏真实模型ID。给定一个应用、一个模型类和一个ID,可以确定性地生成hashid(短名)。此外,给定一个hashid(短名),可以解码出真实ID。因此,不需要在数据库中存储额外字段,每个请求都会解码ID。
动态生成URL
database -> id (1) -> hashslug (K4Nkd) -> url (https:///posts/K4Nkd)
动态解码hashids并查找模型
url (https:///posts/K4Nkd) -> hashslug (K4Nkd) -> id (1) -> database -> model
Hashslugs具有以下属性
- 保证hashslugs对每个ID都是唯一的
- 保证对于不同的模型,将生成不同的hashslugs序列(id为1的帖子将具有与id为1的评论不同的hashslug)
- 保证对于不同的安装,将生成不同的hashslugs序列(取决于.env文件中的app密钥)
请注意,hashids不是随机的,也不是不可预测的。如果这是您关注的问题,请不要使用此包。引用自hashids.org
如果您的句子中同时涉及“安全性”和“hashids”,您有疑问或评论,请勿使用Hashids。
然而,尽管hashslug编码依赖于app密钥,但它不能被攻击者暴露,因为它在传递给Hashids之前被sha256散列。您的app密钥是安全的。
安装
composer require balping/laravel-hashslug
版本
用法
在您希望具有hashid短名的模型上包含trait,以隐藏数值增量ID。
use Illuminate\Database\Eloquent\Model; use Balping\HashSlug\HasHashSlug; class Post extends Model { use HasHashSlug; }
之后,模型将添加slug()
、findBySlug($slug)
和findBySlugOrFail($slug)
函数。
每次您使用Laravel的帮助器生成URL时,都使用hashids(默认长度为5个字符)而不是数值ID
// routes/web.php Route::resource('/posts', 'PostController'); // somewhere else $post = Post::first(); echo action('PostController@show', $post); // prints https:///posts/K4Nkd
然后您可以通过短名解析模型。
// app/Http/Controllers/PostController.php public function show($slug){ $post = Post:findBySlugOrFail($slug); return view('post.show', compact('post')); }
您还可以使用隐式模型绑定。您不需要做任何事情,它会自动工作!
只需为模型添加类型提示,它们就会自动解析
// routes/web.php Route::resource('/posts', 'PostController'); // app/Http/Controllers/PostController.php public function show(Post $post){ return view('post.show', compact('post')); }
如果您需要显式模型绑定,这也是方便的
//app/Providers/RouteServiceProvider.php public function boot(){ parent::boot(); Route::model('article', App\Post::class); } // routes/web.php Route::resource('/articles', 'PostController'); // app/Http/Controllers/PostController.php public function show(Post $post){ return view('post.show', compact('post')); }
自定义
盐值
hashslug序列在每个模型和应用程序安装中的唯一性取决于具有唯一的盐值。
默认情况下,传递给Hashids的盐值取决于.env中定义的应用程序密钥和模型的类名。
应用程序盐值
要更改“应用程序盐值”,请创建文件config/hashslug.php
然后添加以下代码
<?php return [ 'appsalt' => 'your-application-salt' ];
请注意,您不需要配置此设置,但如果您不进行配置并且更改了app密钥,则包含hashslugs的每个URL都会更改。例如,如果用户将此类URL添加到书签,则可能会出现问题。
模型盐值
要使用自定义模型盐值而不是类名
class Post extends Model { use HasHashSlug; protected static $modelSalt = "posts"; }
如果您有多个扩展同一模型的类,并且需要hashslugs保持一致,这可能是一个好主意。
填充
更改缩略词的最小长度(默认:5)
class Post extends Model { use HasHashSlug; protected static $minSlugLength = 10; }
您还可以通过向 config/hashslug.php
添加以下行来全局设置缩略词的最小长度:
'minSlugLength' => 10
字母表
默认的字母表是 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
这也可以更改
class Post extends Model { use HasHashSlug; protected static $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; }
您也可以通过向 config/hashslug.php
添加以下行来全局设置字母表:
'alphabet' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
前缀
您可以为主机名设置一个自定义前缀
class Post extends Model { use HasHashSlug; protected static $hashSlugPrefix = 'post-'; }
这将返回类似 post-K4Nkd
的缩略词。
类似的包以及这个包的不同之处
Laravel Hashids
提供了一个外观,但没有内置的路由。通过 "连接" 允许多个盐。如果您只需要为缩略模型使用 hashids,则是不必要的开销。
Eloquent-Hashids
功能上与这个包非常相似,然而通过使用上面的包,它添加了一个不必要的复杂性层。使用路由绑定是可选的。
Laravel-Hashid
提供了一个外观,类似于上面的一个,以及一个类似于这个包的特质。没有内置的路由。没有提供测试。如果您只需要为缩略模型使用 hashids,则是不必要的开销。
Hashids for Laravel 5
仅提供外观。不如第一个好,因为它只允许您有一个盐。
Optimus
使用不同的混淆方法。仅提供外观(和类)。与路由或模型特质无关。据说比 hashids 快。
Laravel FakeID
与这个包类似,但基于 Optimus 构建。提供外观和特质,以及一个特殊的路由函数。有很好的测试。
许可证
这个包(特性和测试文件)受 GPLv3 许可证许可。