Hello everyone,
We discussed the Mapping configuration of the Doctrine bundles in our last IRC
meeting and I had the time to investigate possible changes tonight. @Fabien: I
know you want the autodetection in to simplify usage for starters, but there
are very real drawbacks about it. I present the problems and a very good
solution (that will not even complicate usage for starters).
First about the auto-detection assumptions:
1. If any *.xml file exists in Resources/config/doctrine/orm/ use the XmlDriver
and register it exclusively for classes $BundleName/Entities.
2. Else If any *.yml file exists in Resources/config/doctrine/orm/ use the
YamlDriver and register it exclusively for classes $BundleName/Entities.
3. If no xml or yml is found assume the user meant Annotations and register it
$bundleName/Entities given that directory exists.
Obvious drawbacks:
1. You HAVE to have your entities in $BundleName/Entities for Annotations
2. Even if you define xml and yml to have entities elsewhere in your resources,
they won't be found, since the mapping driver only matches for
$BundleName/Entities
3. You cannot define any other Mapping Driver (PHP or StaticPHP for example)
4. Taking MongoDB Bundle into the loop. You have to think of absurd Model/*
Entity/* Document/* Inheritance hierachies to be able to re-use code. (See
Doctrine User Bundle)
Not so obvious drawbacks:
1. If you were to snoop around Doctrine Bundles auto detection in your own
extension and do something like:
$mapDef = $container->getDefinition('doctrine.orm.metadata_driver');
$mapDef->addMethodCall('addDriver', array(new Reference('my_driver'),
'MyBundle\Entities');
It wouldnt work! Why? The DriverChain already added an annotations driver for
MyBundle\Entities. So the choice here would be to rename the folder to
something not Entities. So you can only configure it on your own if you don't
follow Symfony2 naming standards.
2. Currently all metadata drivers are added to all entity managers. This is
necessary, because at the moment of Doctrine Bundle Boot, there is no way to
know which bundle is used with which entity manager configuration. Of course
you could say this is for the user to figure out. But it will lead to ALL SQL
to be executed against every Entity Manager all the time when using SchemaTool.
Even for the entities you don't use with that Entity Manager.
3. Bundles that have both ORM and ODM configurations get registered in both ORM
and ODM because of auto-detection. So if i use the MongoDB User Bundle, i still
get Schema Tool suggesting me to add the UserBundle SQL tables.
Solution:
1. Be explicit! At the minimum you have to configure which bundle uses which
ORM/ODM. See a cascading example of the possible configuration complexities:
doctrine.orm:
default:
bundles:
bundleName1: ~
bundleName2: yml
bundleName3: { type: annotation, dir: Entities/ }
bundleName4: { type: xml, dir: Resources/config/doctrine/mapping }
bundleName5: { type: yml, dir: doctrine/metadata }
bundleName6:
type: yml
dir: [bundle-mappings1/, bundle-mappings2/]
bundleName7:
type: my-driver-service
So when shipping the sandbox or defining a new project, the default bundle
should always be enabled for the ORM/ODM to kickstart users:
doctrine.orm:
default:
bundles:
Hello: ~
#doctrine.odm:
# default:
# bundles:
# Hello: ~
2. Don't register the DriverChain for catching entities at "MyBundle\Entities"
but at "MyBundle\" already.
If we have explicit definitions of the bundles you could also make it implicit
again in your own bundles (or in shipped bundles) inside an extension (if you
want). This is what "not so obvious drawbacks" (1) describes. You wouldnt have
to specify the ORM => Bundle dependency in the config.yml but could just go
about and attach it to an ORM/ODM via an extension. We could write some Helper
code so that people can do that in a one-liner in their own extensions.
What do you think?
greetings,
Benjamin
--
If you want to report a vulnerability issue on symfony, please send it to
security at symfony-project.com
You received this message because you are subscribed to the Google
Groups "symfony developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/symfony-devs?hl=en