imikemiller/laravel-pkeys

为 Pkeys 库提供的 Laravel 封装。

dev-master 2017-07-30 19:27 UTC

README

为 Pkeys 库提供的 Laravel 封装

Pkeys

一个与框架无关的密钥管理库,用于保持密钥字符串的一致性,避免团队成员重复或覆盖密钥,防止打字错误和意外的数据类型,以及防止在代码中内联密钥的犯罪行为。

它是用来做什么的?

最初,它是一个用于管理 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 将抛出异常,这使得上述错误很难发生。

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

如何使用

安装

需要 Laravel Pkeys 包

composer require imikemiller/laravel-pkeys

Packagist

发布 Pkeys 配置架构

php artisan vendor:publish

config/app.php 中注册 Pkeys 服务提供者

'providers' => [

    //... other stuff
    
    \LaravelPkeys\PkeysProvider::class,
    
    //... probably more stuff
   
    ]

可选地注册外观

'aliases' => [

    //... other stuff
    
    'Pkey'=>\LaravelPkeys\PkeysFacade::class
    
    //... probably more stuff 
    
    ]

使用

请查看使用 Pkeys 和 Laravel 的示例 这里

定义架构

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

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

Laravel-Pkeys 包包含一个存放在配置目录下名为 pkeys.php 的基本模式。

要在替代路径加载模式,您可以在服务提供者中添加以下内容

    app()->make(\Pkeys\Pkey::class)->setSchema('path/to/alternative/schema.php');

生成键

可以使用以下任何一种方法从 config/pkeys.php 模式定义生成键对象

使用外观
    \Pkey::make('redis.user.messages',['id'=>21]);`
使用助手
    pkey('redis.user.messages',['id'=>21]);`

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

    $key->getKey();

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

可用验证规则

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

自定义验证

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

    app()->make(\Pkeys\Pkey::class)->setValidator($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'=>[
        '~',':','*','.','-'
    ]