Symfony 2依赖注入到实体函数中

9
我正在查看http://symfony.com/doc/2.0/cookbook/service_container/parentservices.html,这是关于it技术的内容。
newsletter_manager:
    class:     %newsletter_manager.class%
    parent: mail_manager
    calls:
        - [ setFilter, [ @another_filter ] ]

我应该可以将服务注入到函数调用中(如果我没有理解错的话)。但是当我在自己的项目中尝试时,

myapp.userBridge:
    class: ...\NotesBundle\Bridge\UserBridge
    arguments:
        - '@doctrine.orm.entity_manager'
myapp.user:
    class: ...\UserBundle\Entity\User
    calls:
        - [ initUserNotesBundle, [ @myapp.userBridge ] ]
        - [ cleanupUserNotesBundle, [ @myapp.userBridge ] ] 

但当函数被调用时(Doctrine 2 生命周期回调:PrePersist)

public function initUserNotesBundle(UserBridge $userBridge) {
    $userBridge->prePersistUser($this);
}

它提供了

Catchable Fatal Error: Argument 1 passed to ...\UserBundle\Entity\User::initUserNotesBundle()
must be an instance of ...\NotesBundle\Bridge\UserBridge, none given,
called in ...\Doctrine\ORM\Mapping\ClassMetadataInfo.php on line 1540
and defined  in ...\UserBundle\Entity\User.php line 319
1个回答

20

这并不是对这个问题的确切回答,而是解决这个问题的另一种方法。我发现我可以使用事件监听器

services:
    my.listener:
        class: Acme\SearchBundle\Listener\SearchIndexer
        tags:
            - { name: doctrine.event_listener, event: postSave }

class SearchIndexer
{
    public function postSave(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        // perhaps you only want to act on some "Product" entity
        if ($entity instanceof Product) {
            // do something with the Product
        }
    }
}

5
那不是替代方法,那是正确的方法 :D 将服务注入实体是不好的实践,它们应该是POPO(普通旧PHP对象)。 - Inoryy
3
纯PHP对象就像POJO一样是一个纯Java对象。 - Steven Rosato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接