shov / laravel-registry
Laravel 的 Registry 模式实现
v0.2
2018-03-22 07:32 UTC
Requires
- php: >=7.0
- illuminate/support: ~5.4
Requires (Dev)
- phpunit/phpunit: ~6.0
- symfony/var-dumper: ^3.4
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 容器以两种方式提供它
- 通过
public function __constructor(Registry $registry)
进行 DI - 作为 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 |
`---------------------------------'
刚才,我把锁定放到待办事项列表上,暂时不处理。