0

当调用setFoo()实体Bar中的方法时,我想完成某种逻辑,例如从数据库中获取对象。我正在考虑创建一个处理这种逻辑的侦听器,但我更愿意创建一种覆盖setFoo()方法的实体包装器或管理器,并且在调用时将透明地执行Bar::setFoo()

这个想法是以透明的方式覆盖提到的方法应用程序,因此例如在提交表单时 bind() 方法也将运行覆盖的 setFoo() 方法而不是Bar::setFoo().

经过一番研究,我发现无法包装我的对象来覆盖 Bar::setFoo()。有谁知道我如何监听 Bar::setFoo() 上的呼叫?由于 prePersist、postLoad、onFlush 等事件侦听器不是有效的解决方案,因为它们在对象验证后被调用,我正在尝试使用以下链接上的公开解决方案,但经过一些测试,我认为它们可以侦听方法调用,除了除了实体方法之外的所有地方,http://jmsyst.com/bundles/JMSAopBundle#transaction-management

有谁知道我怎么能做到这一点?

编辑:最后不得不将 Form::Events 与 EntityManager 结合使用。结果没有预期的那么干净,但功能齐全。

4

1 回答 1

0

您是否考虑过实现代理对象?

class BarProxy extends Bar
{
    private $bar;

    public function __construct(Bar $bar)
    {
        $this->bar = $bar;
    }

    // override all Bar methods and delegate to $this->bar->{method}()

    public function setFoo($foo)
    {
        // your logic
    }
}
于 2013-08-20T09:30:12.273 回答