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
How could this be made possible?
Thanks to all!
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.
These may also help you out a little bit.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With