一个密钥管理库,用于保持密钥字符串的一致性,避免团队成员重复或覆盖密钥,防止拼写错误和意外的数据类型,并阻止在代码中内联密钥的行为。

dev-master 2017-07-30 18:41 UTC

This package is not auto-updated.

Last update: 2024-09-20 23:49:07 UTC


README

一个不依赖框架的密钥管理库,用于保持密钥字符串的一致性,避免团队成员重复或覆盖密钥,防止拼写错误和意外的数据类型,并阻止在代码中内联密钥的行为。

它有什么用?

最初它是用于管理Redis密钥,以避免密钥被重复或覆盖,但后来这个解决方案在分析事件、缓存项、实时消息通道或其他任何通过键字符串标识的内容的管理中找到了用武之地。

例如,你可能需要存储特定一天活跃用户数量的计数。你将其存储在Redis中的键 users:active:20170801 之下,然后继续你的生活。你不知道你的团队成员也需要同样的东西,并将其放在 active:users:20170801 之下。这在代码库中分散开来很难被发现。通过在Pkeys模式中存储所有密钥,你和你的团队成员可以查看任何现有密钥,并避免重复它们。

当你误拼或忘记之前使用的键时,可能会出现类似的问题。也许你需要存储用户的所有消息,键为 user:21:messages。你需要在代码的不同地方执行SADD和SREM(或类似的CRUD操作)。如果你拼错了键,Redis不会告诉你,在晚上11点,当你眼睛模糊时,调试可能会变得很困难。

这些相同的问题也会出现在实时消息通道(PubNub、Pusher、Ably)、缓存键(Memcache、Redis)、事件(Segment、Facebook或Google)和会话存储中。你必须确保你始终一致地使用你的键字符串。

Pkeys如何解决这些问题?

它会在你犯错时给出错误提示!如果你拼错了密钥索引或忘记传递必要的参数,或者参数是意外数据类型,Pkeys将抛出异常,这使得上述错误很难发生。

通过在模式中存储你的键,它使得一致性更容易,并使你的团队成员清楚地知道已经存储了什么,并阻止你覆盖彼此的键。它还允许你查看所有事件和消息通道的合并列表,并确保它们干净且一致。最后,如果你需要更改键以解决冲突,只需在模式中进行简单更改,而无需扫描代码以重构出每个错误的键。

如何使用

安装

composer require imikemiller/pkeys

Packagist

使用

查看使用Pkeys和Redis的示例 这里

定义模式

首先定义你的模式。键可以通过使用数组点符号引用它们的数组路径来访问,例如 redis.user.messages。参数通过花括号 {} 定义。它们可以包含一个 ? 来表示它们是可选的,可以通过使用管道 | 将参数名与验证规则分开来验证。下面提供了实际的示例模式和验证规则列表。

注意:您的模式必须在 schema 键下包含一个数组,并且可以可选地包含一个包含分隔符的数组,键为 delimiters。默认情况下,Pkeys 允许以下分隔符::.-

生成密钥

一旦定义了模式,就可以通过将模式文件路径传递给构造函数将其加载到 Pkeys。

$pkey = new Pkey('path/to/schema.php');

可以通过以下方式从模式生成密钥对象

$key = $pkey->make('redis.user.messages',['id'=>21]);

Pkeys 可以将密钥转换为字符串,通常可以直接传递给您正在使用的任何客户端库。否则,要获取密钥字符串,请调用

$key->getKey();

就是这样!一个解决令人烦恼问题的简单方案。

可用的验证规则

  • alpha:确保参数只包含字母字符。
  • alhpaNum:确保参数只包含字母和数字字符。
  • numeric:确保参数是数字。
  • date:确保参数是有效的日期。
  • email:确保参数是有效的电子邮件。
  • in:确保参数在可接受选项的 CSV 列表中。
  • notIn:确保参数不在 CSV 列表中。
  • json:确保参数是有效的 JSON,有时将完整的 JSON 用作 Redis 的键很有用。

自定义验证

如果您需要添加自定义验证器,可以扩展现有的 \Pkeys\Validation\ValidationRules 类,或者您可以编写自己的类实现 \Pkeys\Interfaces\ValidatorInterface 并将其传递给 Pkey 构造函数。

$pkey = new Pkey('path/to/schema.php',$customValidator);

模式中的验证规则应引用验证器类的方法。

示例模式

     * Real world schema usage examples.
     */
    'schema'=>[
        'redis'=>[
            'user'=>[
                /*
                 * Must have the param `id` passed in and must be numeric
                 */
                'messages'=>'user:{id|numeric}:messages'
            ],
            'users'=>[
                /*
                 * Must have params `status` and `day` passed in.
                 * `status` must be either "active","new" or "returning"
                 * `day` must be a valid date
                 */
                'count'=>'users:{status|in:active,new,returning}:{day|date}:count'
            ]
        ],
        'cache'=>[
            'user'=>[
                /*
                 * Must have param `id` and will accept any value
                 */
                'profile'=>'user.{id}.profile'
            ]
        ],
        'events'=>[
            /*
             * Must have the `type` param passed in which must be pure alpha chars
             * Optionally requires the `event` param which must be either "active","renewed" or "cancelled"
             */
            'subscription'=>'subscription-{type|alpha}-{event|in:active,renewed,cancelled?}'
        ],
        'channels'=>[
            'presence'=>[
                /*
                 * Must have the `id` and `state` params passed in.
                 * `state` must be either "enter" or "leave"
                 */
                'user'=>'user-{id}-presence-{state|in:enter,leave}'
            ]
        ],
        /*
         * Unit testing keys
         */
        'test'=>[
            'custom'=>
                [
                    'success'=>'user~{id|customSuccess}',
                    'fail'=>'user~{id|customFail}'
                ]
        ]
    ],
    /*
     * Optionally set the delimiters the parser will use.
     * These allow the parser to tidy up any doubled up delimiters and to trim the key when optional params are used.
     */
    'delimiters'=>[
        '~',':','*','.','-'
    ]