在单独的Symfony2包中具有不同的表前缀

在单独的Symfony2包中具有不同的表前缀,symfony,doctrine-orm,prefix,Symfony,Doctrine Orm,Prefix,我目前有两个独立的包,一个用于使用oauth2对传入连接进行身份验证,另一个用于管理api/rest调用 我希望与每个bundle相关联的不同表可以根据bundle拥有自己的前缀。例如,第一个包使用oauth,另一个包使用api 我想这两个服务配置文件都是正确的,每一个都指定了不同的前缀: <parameter key="MYBUNDLE.db.table_prefix" type="string" >oauth_</parameter> 及 每个捆绑包也有其服务条目

我目前有两个独立的包,一个用于使用oauth2对传入连接进行身份验证,另一个用于管理api/rest调用

我希望与每个bundle相关联的不同表可以根据bundle拥有自己的前缀。例如,第一个包使用oauth,另一个包使用api

我想这两个服务配置文件都是正确的,每一个都指定了不同的前缀:

<parameter key="MYBUNDLE.db.table_prefix" type="string" >oauth_</parameter> 

每个捆绑包也有其服务条目:

<service id="MYBUNDLE.tblprefix_subscriber" class="MYBUNDLE\Subscriber\TablePrefixSubscriber">
    <argument>%MYBUNDLE.db.table_prefix%</argument>
    <tag name="doctrine.event_subscriber"/>
</service>

但是,如果我执行console命令来创建/更新条令模式,它只对所有表使用api_uu;prefix,而不使用oauth

订阅服务器如下所示:

<?php
namespace MYBUNDLE\Subscriber;

use Doctrine\ORM\Event\LoadClassMetadataEventArgs;

class TablePrefixSubscriber implements \Doctrine\Common\EventSubscriber
{
    protected $prefix = '';

    public function __construct($prefix)
    {
        $this->prefix = (string) $prefix;
    }

    public function getSubscribedEvents()
    {
        return array('loadClassMetadata');
    }

    public function loadClassMetadata(LoadClassMetadataEventArgs $args)
    {
        $classMetadata = $args->getClassMetadata();

        // Do not re-apply the prefix in an inheritance hierarchy.
        if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) {
            return;
        }

        if (FALSE !== strpos($classMetadata->namespace, 'ApiBundle') || FALSE !== strpos($classMetadata->namespace, 'AuthBundle')) {
            $classMetadata->setPrimaryTable(array('name' => $this->prefix . $classMetadata->getTableName()));

            foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
                if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY
                  && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) {
                    $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name'];
                    $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
                }
            }
        }
    }
}
那么,有可能有不同的前缀吗?我认为这是可能的,但我能做到


提前感谢您…

问题似乎是两个前缀共享相同的参数键,第二个前缀覆盖了第一个前缀。
我想您必须使用两个键,比如MYBUNDLE.db.table\u prefix\u oauth和MYBUNDLE.db.table\u prefix\u api。

谢谢,这就是问题所在。除此之外,我为每项服务使用不同的TablePrefix订户。我不知道还有什么方法可以设置不同的表前缀。
<service id="MYBUNDLE.tblprefix_subscriber" class="MYBUNDLE\Subscriber\TablePrefixSubscriber">
    <argument>%MYBUNDLE.db.table_prefix%</argument>
    <tag name="doctrine.event_subscriber"/>
</service>
<?php
namespace MYBUNDLE\Subscriber;

use Doctrine\ORM\Event\LoadClassMetadataEventArgs;

class TablePrefixSubscriber implements \Doctrine\Common\EventSubscriber
{
    protected $prefix = '';

    public function __construct($prefix)
    {
        $this->prefix = (string) $prefix;
    }

    public function getSubscribedEvents()
    {
        return array('loadClassMetadata');
    }

    public function loadClassMetadata(LoadClassMetadataEventArgs $args)
    {
        $classMetadata = $args->getClassMetadata();

        // Do not re-apply the prefix in an inheritance hierarchy.
        if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) {
            return;
        }

        if (FALSE !== strpos($classMetadata->namespace, 'ApiBundle') || FALSE !== strpos($classMetadata->namespace, 'AuthBundle')) {
            $classMetadata->setPrimaryTable(array('name' => $this->prefix . $classMetadata->getTableName()));

            foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
                if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY
                  && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) {
                    $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name'];
                    $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
                }
            }
        }
    }
}