Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Doctrine2 entities in multiple namespaces

I'm developing a web application using Zend Framework 2 which will be made of several modules, and I'd like to put the entity classes in the module to which they belong.

Is it possible to do this using Doctrine2 ORM? By reading the docs, it seems to always expect to have all the entities under at most one namespace, while I'd like to have

  • Module1\Entity
  • Module2\Entity
  • and so on...

How could this be made possible?

Thanks to all!

like image 474
Matteo Tassinari Avatar asked Oct 04 '12 06:10

Matteo Tassinari


1 Answers

The first step to doctrine configuration is within your global configuration file to set up the connection. Personally i do this in two files, the first is ./config/autoload/global.php and the second one being ./config/autoload/local.php

This is for one very reason and this is that anything containing local doesn't get posted into my git repositories. So my credentials are safe.

./config/autoload/global.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
        'params' => array(
          'host'     => 'localhost',
          'port'     => '3306',
          'dbname'   => 'dbname'
        )
      )
    )
  ),
);

./config/autoload/local.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'params' => array(
          'user'     => 'root',
          'password' => ''
        )
      )
    )
  ),
);

The second step would be to create a driver for your entities. This is done on Module Namespace base.

./modules/ModuleNamespace/config/module.config.php

<?php
namespace ModuleNamespace;

return array(
  //... some more configuration

  'doctrine' => array(
    'driver' => array(
      __NAMESPACE__ . '_driver' => array(
        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
        'cache' => 'array',
        'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
      ),
      'orm_default' => array(
        'drivers' => array(
          __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
        )
      )
    )
  )
);

What's happening there? Well, we extend the doctrine['driver'] array by adding a new driver. The driver has the namespace of our module. For this we also need to define the namespace in our configuration file. The driver defines that all Entities for this driver are within a certain path.

The next step done is that the orm_defaults driver gets extended by an assignment defining that all ModuleNamespace\Entity classes are loaded from our ModuleNamespace_driver configuration.

And ultimately this is done for each single module. So no matter if you're having a Filemanager\Entity\File or PictureDb\Entity\File classes, both will work and both will get loaded. Modules are - by nature - independant from each other. Though they can have dependencies, or rather work well together, they function on their own. So multiple modules with multiple entities are no problem at all ;)

I hope this makes you understand the topic a little bit. For live working examples i have wrote two blog posts covering the topic.

  • Installing Doctrine 2 for Zend Framework 2
  • First Steps with Doctrine 2

These may also help you out a little bit.

like image 179
Sam Avatar answered Oct 18 '22 15:10

Sam