shov/laravel-registry

Laravel 的 Registry 模式实现

v0.2 2018-03-22 07:32 UTC

This package is not auto-updated.

Last update: 2024-09-19 18:57:31 UTC


README

安装

在项目根目录运行 composer require shov/laravel-registry

在您的 config/app.php 中注册服务提供者

    providers' => [
        ...
        
        /*
         * Package Service Providers...
         */
        Shov\Registry\RegistryServiceProvider::class,
        
        ...
    ]
    

使用

您可以使用 DI 或 Facade 来获取注册实例

$this->registry
    ->set('foo', 'x')
    ->values(['bar' => 'y']);
    
$xy = $this->registry->get('foo') 
      . $this->registry->get('bar');
      
assert('xy' === $xy);

$empty = $this->registry
            ->set('some', 'value')
            ->set('foo', 'bar')
            ->immutable('answer', 42)
            ->flush(true)
            ->all();
            
assert(empty($empty));

方法

概述

本项目的目标是实现此接口

,---------------------------------------------.
|RegistryInterface                            |
|---------------------------------------------|
|---------------------------------------------|
|+has(string $key): bool                      |
|                                             |
|+get(string $key, $default = null): mixed    |
|+all(array $defaults = []): array            |
|                                             |
|+set(string $key, $value): static            |
|+values(array $pairs): static                |
|                                             |
|+immutable(string $key, $value): static      |
|                                             |
|+forget(string $key): static                 |
|+flush(bool force): static                   |
|                                             |
|+getImmutableKeys(): array                   |
|                                             |                                             |
|+stopPersist(): static                       |
`---------------------------------------------'

并通过 IoC 容器以两种方式提供它

  1. 通过 public function __constructor(Registry $registry) 进行 DI
  2. 作为 Facade Registry::has('key');

保存和加载数据是通过构造函数提供的成员根据 SaverInterface、LoaderInterface 接口来执行的。我希望能提供几种类似 DbSaver、StorageSaver、FakeSaver(保存时不做任何操作)的实现。所以让我们来看一下接口

,---------------------.
|SaverInterface       |
|---------------------|
|---------------------|
|+save(array $pairs)  |
`---------------------'

,---------------------.
|LoaderInterface      |
|---------------------|
|---------------------|
|+load(): array       |
`---------------------'

然后,我们应该发布一个配置,它设置了在运行时我们将使用的实现

暂时我会把任务放到问题标签页上

锁定

现在,我将解释我关于锁定的观点。

,---------------------------------------------.
|RegistryInterface                            |
|---------------------------------------------|
|---------------------------------------------|
|                                             |
|+lock(string ...$keys): static               |
|+lockAll(): static                           |
|+getLockedKeys(): array                      |
|                                             |
`---------------------------------------------'

首先,锁定不是持久的,这意味着您需要锁定的键对应该在每次脚本运行时都进行锁定。在锁定之前,其值可能会被更改。

因此,尽管您希望锁定键对,但在脚本运行期间没有方法可以解锁。

然而,重要的是要记住,常规注册器有一个全局存储,任何其他进程都可以更改锁定键对的值。

全局实例是危险的。实际上,我必须对此进行更多的思考。也许有理由持久化锁定键对,或者否则永远不要持久化它们。

我将锁定放在另一个实例上的情况

,---------------------------------.
|LockerInterface                  |
|---------------------------------|
|---------------------------------|
|+lock(string ...$keys): array    |
|+unlock(string ...$keys): static |
|                                 |
|+isLocked(string $key): bool     |
|+getLockedKeys(): array          |
`---------------------------------'

刚才,我把锁定放到待办事项列表上,暂时不处理。