cybercog/laravel-optimus

为Laravel提供的Optimus桥梁。基于Knuth乘法散列方法的ID混淆。

3.11.0 2024-03-09 14:29 UTC

This package is auto-updated.

Last update: 2024-09-09 18:38:51 UTC


README

cog-laravel-optimus

Discord Releases Build StyleCI Code Quality License

介绍

Laravel对Optimus库的包装,由Jens Segers开发,支持多个连接。Optimus是一个小巧的开源库,可以从数字生成短、唯一、非顺序的ID。使用这个库,你可以将内部ID转换成基于Knuth整数的混淆整数。它与Hashids类似,但会生成整数而不是随机字符串。它也非常快。

内容

特性

安装

首先,通过Composer拉取包。

composer require cybercog/laravel-optimus

手动注册包(可选)

如果您禁用了包自动发现,则可以手动注册。

app/config/app.php中包含服务提供者。

'providers' => [
    Cog\Laravel\Optimus\Providers\OptimusServiceProvider::class,
],

如果您想使用外观,请将引用添加到config/app.php中的别名数组中。

'aliases' => [
    'Optimus' => Cog\Laravel\Optimus\Facades\Optimus::class,
],

配置

Laravel Optimus需要连接配置。要开始,您需要发布配置文件

php artisan vendor:publish --provider="Cog\Laravel\Optimus\Providers\OptimusServiceProvider" --tag="config"

这将创建一个config/optimus.php文件,您可以在其中修改以设置配置。同时,请确保检查此包中原始配置文件在版本之间的更改。

默认连接名称

此选项default是您可能指定要使用以下哪个连接作为所有工作的默认连接的地方。当然,您可以使用管理器类同时使用多个连接。此设置的默认值是main

Optimus连接

此选项connections是设置应用程序中每个连接的地方。已包括示例配置,但您可以添加尽可能多的连接。

Optimus数字生成

要开始,您需要在主连接中获取3个密钥;

  • prime:小于2147483647的大质数
  • inverse:逆质数,以便(PRIME * INVERSE) & MAXID == 1
  • random:小于2147483647的大随机整数

幸运的是,有一个控制台命令可以为您完成所有这些,只需运行以下命令

php vendor/bin/optimus spark

将生成的整数复制粘贴到连接配置中。

用法

OptimusManager

这是最感兴趣的类。它绑定到 ioc 容器中的 optimus,可以通过 Facades\Optimus 门面访问。这个类通过扩展 AbstractManager 实现了 ManagerInterface。接口和抽象类都是 Graham Campbell 的 GitHub 上的 Laravel Manager 包的一部分,因此您可能想查看该存储库中的文档,了解如何使用管理器类。请注意,返回的连接类始终是 Jenssegers\Optimus\Optimus 的一个实例。

Facades\Optimus

此门面将动态地将静态方法调用传递到 ioc 容器中的 optimus 对象,默认情况下是 OptimusManager 类。

Providers\OptimusServiceProvider

此类不包含任何有趣的公共方法。应在 config/app.php 中的 providers 数组中添加此类。此类将设置 ioc 绑定。

Traits\OptimusEncodedRouteKey

此特性可以用于 Eloquent 模型,以启用自动路由模型绑定。您可以在路由闭包或控制器中为模型提供类型提示,然后 Laravel 将根据编码后的 ID 尝试查找它。

示例

在这里,您可以看到这个包是如何简单易用的。默认适配器是 main。在配置文件中输入您的身份验证详细信息后,它就可以正常工作了。

编码 ID

Cog\Laravel\Optimus\Facades\Optimus::encode(20); // 1535832388

解码 ID

Cog\Laravel\Optimus\Facades\Optimus::decode(1535832388); // 20

更改 Optimus 连接

Optimus 管理器将表现得像 Jenssegers\Optimus\Optimus。如果您想调用特定的连接,可以使用连接方法。

use Cog\Laravel\Optimus\Facades\Optimus;

// Writing this…
Optimus::connection('main')->encode($id);

// …is identical to writing this
Optimus::encode($id);

// and is also identical to writing this.
Optimus::connection()->encode($id);

// This is because the main connection is configured to be the default.
Optimus::getDefaultConnection(); // This will return main.

// We can change the default connection.
Optimus::setDefaultConnection('alternative'); // The default is now alternative.

依赖注入

如果您像我一样喜欢使用依赖注入而不是门面,则可以注入管理器。

use Cog\Laravel\Optimus\OptimusManager;

class Foo
{
    protected $optimus;

    public function __construct(OptimusManager $optimus)
    {
        $this->optimus = $optimus;
    }
    
    public function bar($id)
    {
        return $this->optimus->encode($id)
    }
}

app()->make('Foo')->bar(20);

隐式路由模型绑定

要启用基于编码 ID 的 隐式路由模型绑定,您只需 配置素数 并在您的模型中使用 Cog\Laravel\Optimus\Traits\OptimusEncodedRouteKey 特性。

如果您不想使用默认的 Optimus 连接,您可以在模型中添加一个 $optimusConnection 属性来指定自定义连接。

use Cog\Laravel\Optimus\Traits\OptimusEncodedRouteKey;
use Illuminate\Database\Eloquent\Model;

class YourModel extends Model
{
    use OptimusEncodedRouteKey;
    
    protected $optimusConnection = 'custom'; // optional
}

现在您可以在路由闭包或控制器中为模型提供类型提示,然后 Laravel 将使用编码后的 ID 查询数据库。

注意:隐式路由模型绑定需要 Laravel 的 Illuminate\Routing\Middleware\SubstituteBindings 中间件,它是 web 中间件组的一部分。

Route::get('url/to/{model}', function (YourModel $model) {
    // ...
})->middleware('web');

要生成这些路由的 URL,您可以选择获取编码的路由键。

$encodedId = $model->getRouteKey();
$url = url("url/to/{$encodedId}");

或者,您可以使用命名路由并传递模型。Laravel 将完成其余的工作。

$url = route('my.named.route', $model);

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

测试

使用以下命令运行测试:

vendor/bin/phpunit

安全

如果您发现任何安全问题,请通过电子邮件发送至 anton@komarev.com,而不是使用问题跟踪器。

贡献者

Laravel Optimus 贡献者列表

此包受到 Laravel Hashids 包的启发。

此包是对 Optimus 库 的封装。

替代方案

请随时通过拉取请求添加更多替代方案。

许可

🌟 随时间推移的 Star 数量

Stargazers over time

关于CyberCog

CyberCog 是一个由爱好者组成的社交联盟。研究产品与软件开发中的最佳解决方案是我们的热情所在。

CyberCog