northwoods/entity-proxy

具有私有属性的对象的保湿代理

2.1.0 2018-09-10 22:36 UTC

This package is auto-updated.

Last update: 2024-09-13 10:55:56 UTC


README

Become a Supporter Latest Stable Version License Build Status Code Coverage Scrutinizer Code Quality

一个基于 反射 的代理,用于保湿具有私有属性的对象。

努力遵循 PSR-1PSR-2PSR-4 规范。

安装

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根据业务需求来更改状态。由于实体被认为是一个持久对象,其构造函数应该只调用 一次,在整个实体的生命周期内。这允许通过构造函数触发领域事件,以通知应用程序,例如,新用户已注册。

考虑到这个限制,对保湿器的需求是

  1. 它必须不调用实体构造函数。
  2. 它必须能够设置私有/受保护属性。
  3. 它必须尽可能高效。

实现这些目标的最简单方法是通过反射,这允许我们 创建不带构造函数的对象使属性可访问写入属性值。每个类的反射应该在其生命周期的工厂内部缓存,以最大化性能。

如果性能是关注点,有其他 可行的方案,虽然更快,但设置和使用更复杂。

许可

MIT