首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用EntityManager扩展EntityManagerDecorator在UnitOfWork中留下错误的引用

用EntityManager扩展EntityManagerDecorator在UnitOfWork中留下错误的引用
EN

Stack Overflow用户
提问于 2015-02-27 18:03:08
回答 1查看 3.4K关注 0票数 6

我正在尝试使用EntityManagerDecorator扩展EntityManagerDecorator中的UnitOfWork,但是遇到了一个问题,即引用UnitOfWork中的基本EntityManager通过$eventArgs传递给prePersist事件。

看起来,在创建EntityManager时,EntityManager::__construct中的UnitOfWork被传递给了UnitOfWork

我认为解决方案可能是我可以在MyEntityManagerDecorator::getUnitOfWork()中覆盖默认的MyEntityManagerDecorator::getUnitOfWork(),如下所示:

代码语言:javascript
复制
public function getUnitOfWork()
{
    if ($this->unitOfWork === null) {
        $this->unitOfWork = new UnitOfWork($this);
    }

    return $this->unitOfWork;
}

但是,我注意到UnitOfWork::__construct()需要一个EntityManager而不是EntityManagerInterface,所以这是行不通的。

我正在寻找如何从MyEntityManagerDecorator $eventArgs->getEntityManager()而不是基本EntityManager中获取EntityManager。我想在不直接继承 EntityManager的情况下执行这个EntityManager。文档还说:“永远不要尝试从EntityManager继承:继承不是EntityManager的有效扩展点。”

我不知道你需要什么代码样本,如果有的话,请告诉我,如果你需要更多的信息。我可以像预期的那样访问项目中其他地方的MyEntityManagerDecorator (到目前为止我已经尝试过了)。我在yml中设置了装饰器,如下所示:

代码语言:javascript
复制
my_multi_tenant_entity_manager:
    public: false
    class: My\MultiTenantBundle\ORM\MyEntityManagerDecorator
    decorates: doctrine.orm.default_entity_manager
    arguments: [ "@my_multi_tenant_entity_manager.inner" ]

下面是我从composer中使用的软件包和版本号列表:

代码语言:javascript
复制
installed:
doctrine/annotations                 v1.2.3             Docblock Annotations Parser
doctrine/cache                       v1.4.0             Caching library offering...
doctrine/collections                 v1.2               Collections Abstraction ...
doctrine/common                      v2.4.2             Common Library for Doctr...
doctrine/dbal                        v2.5.1             Database Abstraction Layer
doctrine/doctrine-bundle             v1.3.0             Symfony DoctrineBundle
doctrine/doctrine-cache-bundle       v1.0.1             Symfony2 Bundle for Doct...
doctrine/doctrine-migrations-bundle  dev-master 6a1bd73 Symfony DoctrineMigratio...
doctrine/inflector                   v1.0.1             Common String Manipulati...
doctrine/instantiator                1.0.4              A small, lightweight uti...
doctrine/lexer                       v1.0.1             Base library for a lexer...
doctrine/migrations                  dev-master 058a463 Database Schema migratio...
doctrine/orm                         v2.4.7             Object-Relational-Mapper...
incenteev/composer-parameter-handler v2.1.0             Composer script handling...
jdorn/sql-formatter                  v1.2.17            a PHP SQL highlighting l...
kriswallsmith/assetic                v1.2.1             Asset Management for PHP
monolog/monolog                      1.12.0             Sends your logs to files...
phpdocumentor/reflection-docblock    2.0.4              
phpspec/prophecy                     v1.3.1             Highly opinionated mocki...
phpunit/php-code-coverage            2.0.15             Library that provides co...
phpunit/php-file-iterator            1.3.4              FilterIterator implement...
phpunit/php-text-template            1.2.0              Simple template engine.
phpunit/php-timer                    1.0.5              Utility class for timing
phpunit/php-token-stream             1.4.0              Wrapper around PHP's tok...
phpunit/phpunit                      4.5.0              The PHP Unit Testing fra...
phpunit/phpunit-mock-objects         2.3.0              Mock Object library for ...
psr/log                              1.0.0              Common interface for log...
raven/raven                          dev-master 407d770 A PHP client for Sentry ...
sebastian/comparator                 1.1.1              Provides the functionali...
sebastian/diff                       1.2.0              Diff implementation
sebastian/environment                1.2.1              Provides functionality t...
sebastian/exporter                   1.2.0              Provides the functionali...
sebastian/global-state               1.0.0              Snapshotting of global s...
sebastian/recursion-context          1.0.0              Provides functionality t...
sebastian/version                    1.0.4              Library that helps with ...
sensio/distribution-bundle           v3.0.16            Base bundle for Symfony ...
sensio/framework-extra-bundle        v3.0.4             This bundle provides a w...
sensio/generator-bundle              v2.5.2             This bundle generates co...
sensiolabs/security-checker          v2.0.1             A security checker for y...
swiftmailer/swiftmailer              v5.3.1             Swiftmailer, free featur...
symfony/assetic-bundle               v2.6.1             Integrates Assetic into ...
symfony/monolog-bundle               v2.7.1             Symfony MonologBundle
symfony/swiftmailer-bundle           v2.3.8             Symfony SwiftmailerBundle
symfony/symfony                      v2.6.4             The Symfony PHP framework
twig/extensions                      v1.2.0             Common additional featur...
twig/twig                            v1.18.0            Twig, the flexible, fast...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-27 19:26:42

我建议装饰(而不是直接扩展) EntityManager,因为它放松了实现与继承组件之间的耦合。

为了能够区分那些确实与租户有关系的实体,实现/扩展这些类与interfacemapped superclass之间的关系。

securityContext (用于演示目的)是为了获得对租户的引用。

代码语言:javascript
复制
/**
 * `EntityManagerDecorator` exists since v2.4
 */
class MultiTenantEntityManager extends EntityManagerDecorator {

    private $securityContext;

    public function __construct(EntityManagerInterface $entityManager, $securityContext) {
        parent::__construct($entityManager);
        $this->securityContext = $securityContext;
    }

    public function persist($entity) {
        // set the tenant before persisting an entity
        if ($entity instanceof MultiTenantEntity) {
            $userId = $this->securityContext->getUserId();
            $tenant = $this->wrapped->find($userId,...);
            $entity->setTenant($tenant);
        }
        return $this->wrapped->persist($entity);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28771483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档