您可以通过将doctrine event-system 与侦听器/订阅者挂钩来动态调整表名(和映射)。
即“loadClassMetadata”是doctrine's events 之一,您可以按照食谱文章How to Register Event Listeners and Subscribers 中的说明为其创建侦听器/订阅者。
示例
config.yml
services:
mapping.listener:
class: Acme\YourBundle\EventListener\MappingListener
tags:
- { name: doctrine.event_listener, event: loadClassMetadata }
映射监听器
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
class MappingListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
$table = $classMetadata->table;
$oldName = $table['name']; // ... or $classMetaData->getTableName()
// your logic here ...
$table['name'] = 'new_table_name';
$classMetadata->setPrimaryTable($table);
// ... or add a field-mapping like this
$fieldMapping = array(
'fieldName' => 'about',
'type' => 'string',
'length' => 255
);
$classMetadata->mapField($fieldMapping);
ClassMetadata 扩展 ClassMetadataInfo 并提供一个公共变量“table”(包含您的注释或 yml 提供的映射信息),您可以修改它!
公共表变量是一个包含以下条目的数组:
- 姓名 =>
- 架构 =>
- 索引 => 数组
- uniqueConstraints => 数组
您可以在保存/更新之前在控制器中动态注册事件侦听器/订阅者。
$mappingListener = new MappingListener();
// ... maybe even modify the listener using reflection
$evm = $this->get('doctrine')->getManager()->->getEventManager();
$evm->addEventListener('loadClassMetadata', $mappingListener);
此外,您可以引入多个数据库连接/名称并在您的应用程序中访问它们。
app/config/config.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
customer:
driver: "%database_driver2%"
host: "%database_host2%"
port: "%database_port2%"
dbname: "%database_name2%"
user: "%database_user2%"
password: "%database_password2%"
charset: UTF8
然后使用...获取不同的实体管理器
$em = $this->get('doctrine')->getManager('default');
$em2 = $this->get('doctrine')->getManager('customer');
或存储库
$customers = $this->get('doctrine')
->getRepository('AcmeCustomerBundle:Customer', 'customer')
->findAll()
;
... 或 add connections 动态
$this->get('doctrine')
->connection('mysql://username:password@localhost/test', 'dynamic_connection');
在食谱章节How to work with Multiple Entity Managers and Connections中阅读有关该主题的更多信息。