northwoods / entity-proxy
具有私有属性的对象的保湿代理
2.1.0
2018-09-10 22:36 UTC
Requires
- php: >=7.2
Requires (Dev)
- phpstan/phpstan: ^0.10.3
- phpstan/phpstan-phpunit: ^0.10.0
- phpunit/phpunit: ^7.3
- squizlabs/php_codesniffer: ^3.2
This package is auto-updated.
Last update: 2024-09-13 10:55:56 UTC
README
一个基于 反射 的代理,用于保湿具有私有属性的对象。
安装
composer require northwoods/entity-proxy
使用方法
代理通过单例 ProxyFactory
创建
use Northwoods\EntityProxy\ProxyFactory;
代理可以作为现有对象的包装器创建
$proxy = ProxyFactory::modify($user); $proxy->set('email', 'user@example.com');
或者从其他数据源保湿时的新实例
$proxy = ProxyFactory::create(User::class); $proxy->setArray([ 'id' => 1234, 'username' => 'jane.doe', 'email' => null, ]); /** @var User */ $user = $proxy->reveal();
代理还可以读取对象上的现有值
$username = $proxy->get('username');
理由
在领域驱动设计中,通常建议实体使用私有属性和getter来访问状态,以及使用setter根据业务需求来更改状态。由于实体被认为是一个持久对象,其构造函数应该只调用 一次,在整个实体的生命周期内。这允许通过构造函数触发领域事件,以通知应用程序,例如,新用户已注册。
考虑到这个限制,对保湿器的需求是
- 它必须不调用实体构造函数。
- 它必须能够设置私有/受保护属性。
- 它必须尽可能高效。
实现这些目标的最简单方法是通过反射,这允许我们 创建不带构造函数的对象、使属性可访问 和 写入属性值。每个类的反射应该在其生命周期的工厂内部缓存,以最大化性能。
如果性能是关注点,有其他 可行的方案,虽然更快,但设置和使用更复杂。
许可
MIT