pacificinternet/laravel-hashslug

提供在模型上使用Hashids特性的包

1.0.0 2023-07-17 07:52 UTC

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具有以下属性

  1. 保证hashslugs对每个ID都是唯一的
  2. 保证对于不同的模型,将生成不同的hashslugs序列(id为1的帖子将具有与id为1的评论不同的hashslug)
  3. 保证对于不同的安装,将生成不同的hashslugs序列(取决于.env文件中的app密钥)

请注意,hashids不是随机的,也不是不可预测的。如果这是您关注的问题,请不要使用此包。引用自hashids.org

如果您的句子中同时涉及“安全性”和“hashids”,您有疑问或评论,请勿使用Hashids。

然而,尽管hashslug编码依赖于app密钥,但它不能被攻击者暴露,因为它在传递给Hashids之前被sha256散列。您的app密钥是安全的。

安装

composer require balping/laravel-hashslug

版本

注意:此包需要PHP的BC MathGMP扩展才能正常工作。

用法

在您希望具有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 许可证许可。