malenki / token-generator
简单的基于十六进制的令牌生成器,可用于许多任务,如slug、令牌等。
Requires
- php: >=7.1.0
This package is auto-updated.
Last update: 2024-08-29 05:07:01 UTC
README
为什么?
为了生成指定字节长度的随机十六进制字符串(默认)。
非常基本的示例
use Malenki\TokenGenerator\TokenGenerator; echo new TokenGenerator(); // yes, __toString available // a560bd176d5961817050a4c09408b156952d8d53bd7602d28f2844b1faa2995c
这灵感来源于 Akam 在 php.net 网站上提供的示例: https://php.ac.cn/manual/fr/function.random-bytes.php#118932
如何获取它?
使用 composer 是一个好方法。
composer require malenki/token-generator
玩转它
起始字节
在构造函数中,您可以指定所需的字节长度。如果没有指定,默认为 32。
use Malenki\TokenGenerator\TokenGenerator; $tg = new TokenGenerator(4); echo $tg->run(); // the method computing token and returning it // 791f4dd3 by example
但请注意,这并不是输出长度。例如,字节长度为 4 的结果默认为具有 8 个字节的输出,因为默认的口味输出十六进制字符串。
口味
内部,此生成器使用 3 种不同的口味来构建令牌,按此顺序加载:
- 随机 口味定义在
Malenki\TokenGenerator\Flavor\RandomFlavor
- OpenSSL 口味定义在
Malenki\TokenGenerator\Flavor\OpensslFlavor
- Mcrypt 口味定义在
Malenki\TokenGenerator\Flavor\McryptFlavor
(注意:如果您的 PHP 版本为 7.2 或更高,则不可用)
默认情况下,它会检查第一个(随机),是否可以在您的系统上运行,并运行它。如果无法运行,则测试第二个(OpenSSL),依此类推。
格式化器
格式化器允许您具有不同的输出令牌类型。因此,默认情况下,使用的格式化器是 hex
(简称)定义在 Malenki\TokenGenerator\Formater\HexFormater
(FQCN)中。
格式化器包括:
hex
以十六进制字符串的形式获取令牌alpha
以从 a 到 z 的 ASCII 字母组成的令牌num
以数字组成的令牌base64
以从其起始生成的字节为基础 64 编码的字符串获取令牌
您可以通过将格式化器的简称传递给 TokenGenerator::run()
方法来选择格式化器。示例
$tg = new TokenGenerator(2); printf('A token using `alpha` formater: "%s"'.PHP_EOL, $tg->run('alpha')); // A token using `alpha` formater: "rkv" printf('A token using `num` formater: "%s"'.PHP_EOL, $tg->run('num')); // A token using `num` formater: "60286" printf('A token using `base64` formater: "%s"'.PHP_EOL, $tg->run('base64')); // A token using `base64` formater: "8Yk=" printf('A token using `hex` formater: "%s"'.PHP_EOL, $tg->run('hex')); // A token using `hex` formater: "971b"
令牌对象
生成器返回的不是简单字符串,而是一个来自 Token 类的对象,该对象具有 __toString()
以在字符串上下文中获取十六进制格式。
此对象包含有关
- 口味 用于构建它
- 格式化器 用于格式化它
- 字节长度 选择用于生成它
- 原始字节字符串 用于获取它
- 它的有效性,如果用于创建它的自定义口味有一些错误(通常是空字符串)
示例
$tg = new TokenGenerator(2); $token = $tg->run(); echo $token->getOriginalBytesLength() . PHP_EOL; echo $token->getUsedFlavor() . PHP_EOL; echo $token->getUsedFormater() . PHP_EOL; echo $token->get() . PHP_EOL; echo ($token->valid() ? 'yes' : 'no') . PHP_EOL; echo $token . PHP_EOL; // 2 // Malenki\TokenGenerator\Flavor\RandomFlavor // Malenki\TokenGenerator\Formater\HexFormater // 4b31 // yes // 4b31
添加您自己的口味
好的,你喜欢这个生成器,但你想令牌有一些特定的构建规则。
您可以创建自己的口味并使用它。
首先 创建一个继承自 Malenki\TokenGenerator\Flavor\Flavor
抽象类的口味类。
此抽象类具有您必须实现的方法
abstract class Flavor { abstract public function valide() : bool; // can load on the system? abstract public function generate(int $length) : string; // generate the token }
让我们将您的类 FQCN 定义为 Some\Namespace\YourFlavor
。
其次,在实例化时声明它,因此,它知道它的存在并可以将其使用。
use Malenki\TokenGenerator\TokenGenerator; use Some\Namespace\YourFlavor; $tg = new TokenGenerator(32, new YourFlavor); echo $tg->run();
然后,您就可以使用自己的口味来生成第一个令牌了!
添加您自己的格式化器
和创建自定义口味一样简单。
只需实现抽象类 Malenki\TokenGenerator\Formater\Formater
abstract class Formater { abstract public function format(string $original) : string; }
例如,您的格式化器可能包括在十六进制部分之前包含一个日期字符串
use Malenki\TokenGenerator\Formater\Formater; class CustomFormater extends Formater { public function format(string $original) : string { $dt = new \DateTime(); $dtStr = $dt->format('Y-m-d-'); $preToken = bin2hex($original); return $dtStr.$preToken; } }
现在,将其声明给生成器
$tg = new TokenGenerator(2); $tg->addFormater('custom', CustomFormater::class); echo $tg->run('custom'). PHP_EOL; // 2019-06-28-ea15
简单,不是吗?