Php 带前缀的Symfony原则(迁移)

Php 带前缀的Symfony原则(迁移),php,doctrine-orm,database-migration,symfony,Php,Doctrine Orm,Database Migration,Symfony,我们的应用程序需要有一个表前缀名称。我希望我们不需要它,但用户就是用户。 现在我们有了这个表 class TablePrefixSubscriber implements \Doctrine\Common\EventSubscriber { protected $prefix = ''; public function __construct($prefix = '') { $this->prefix = (string) $prefix; } public function lo

我们的应用程序需要有一个表前缀名称。我希望我们不需要它,但用户就是用户。 现在我们有了这个表

class TablePrefixSubscriber implements \Doctrine\Common\EventSubscriber {
protected $prefix = '';
public function __construct($prefix = '') {
    $this->prefix = (string) $prefix;
}
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) {
    $classMetadata = $eventArgs->getClassMetadata();
    if(strlen($this->prefix)) {
        if(0 !== strpos($classMetadata->getTableName(), $this->prefix)) {
            $classMetadata->setTableName($this->prefix . $classMetadata->getTableName());
        }
    }
    foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
        if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadataInfo::MANY_TO_MANY) {
            if(!isset($classMetadata->associationMappings[$fieldName]['joinTable'])) { continue; }
            $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name'];
            if(0 !== strpos($mappedTableName, $this->prefix)) {
                $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
            }
        }
    }
}
public function getSubscribedEvents() {
    return array('loadClassMetadata');
}
服务配置:

services:
app.event.doctrine.table_prefix_subscriber:
class: RYZ\Bundle\CoreBundle\EventListener\TablePrefixSubscriber
arguments: ['%database_prefix%']
tags:
  - { name: doctrine.event_subscriber }
如果没有迁移或没有手动编写查询(通过使用查询生成器),那么这种方法可以很好地工作

我不知道如何在迁移中向查询添加前缀

如果我可以在迁移中访问prefix配置变量
database\u prefix
,并将其添加到每个查询中,那就好了

我还希望访问实体存储库类中的变量

如果有人能给我指出正确的方向,我会很高兴


更新:我听说过条令命名策略,但我认为这对我没有帮助?()

好的,我想我找到了迁移的解决方案: 关键词:ContainerWareInterface

您可以对迁移类实现
ContainerWareInterface
,只需访问已实现的所有参数和服务。太好了

以下是一个例子:

<?php

namespace FooBla\Migrations;

use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class Version20160810121166 extends AbstractMigration implements ContainerAwareInterface
{
    private $container;

public function setContainer(ContainerInterface $container = null)
{
    $this->container = $container;
}

/**
 * @param Schema $schema
 */
public function up(Schema $schema)
{
    $em = $this->container->getParameter('database_prefix'); //Just use the parameter directly in the migration calls
    $this->addSql('CREATE TABLE `'.$em.'sessions` (`sess_id` VARBINARY(128) NOT NULL PRIMARY KEY, `sess_data` BLOB NOT NULL, `sess_time` INTEGER UNSIGNED NOT NULL, `sess_lifetime` MEDIUMINT NOT NULL) COLLATE utf8_bin, ENGINE = InnoDB');
}

/**
 * @param Schema $schema
 */
public function down(Schema $schema)
{
}
}