2016-08-11 4 views
2

Нам нужно иметь имя префикса таблицы для нашего приложения. Мне жаль, что нам это не понадобится, но пользователи - пользователи. В настоящее время у нас есть этот TablePrefix АбонентуSymfony Doctrine (Migration) с префиксом

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 } 

Это работает просто отлично, если у вас нет миграции или не писать запросы вручную (с помощью конструктора запросов).

Я понятия не имею, как добавить префикс к запросу в миграции доктрины.

Было бы хорошо, если бы я мог получить доступ к переменной конфигурации префикса database_prefix в процессе миграции и просто добавить ее к каждому запросу.

Также я хочу получить доступ к переменной в классах репозитория Entity.

Я был бы счастлив, если бы кто-нибудь мог указать мне в правильном направлении.

Обновление: Я слышал о стратегии именования доктрин, но я думаю, что это не поможет мне здесь? (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/namingstrategy.html)

ответ

0

Хорошо, я думаю, я нашел решение для миграции: слова: ContainerAwareInterface

Вы можете реализовать ContainerAwareInterface вашу миграцию класса и просто получить доступ ко всем параметрам и услуги, которые осуществили. Великая вещь!

Вот пример:

<?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) 
{ 
} 
}