[DDC-2156] [regression] EntityManager::find() doesn't call custom repository anymore Created: 19/Nov/12 Updated: 27/Nov/12 Resolved: 27/Nov/12
|Project:||Doctrine 2 - ORM|
|Reporter:||Stan Imbt||Assignee:||Benjamin Eberlei|
Up to version 2.2 the entity manager would forward calls to find() to the respective repositories. In 2.3 the entity manager handles these calls directly.
This interferes with custom repositories that have an overridden find() method.
It's inconsistent, because $em->getRepository('Foo')->find($id) may do something different to $em ->find('Foo', $id) now.
Not sure if this is intentional. If it is, it's missing in the change log and the docs (7.8.1. "Essentially, EntityManager#find() is just a shortcut for the following...").
In any case it's a big BC issue for us:
|Comment by Benjamin Eberlei [ 25/Nov/12 ]|
The problem is, that users changing EntityRepository#find() is actually why we moved the code to EntityManager#find(), because the behavior is required to work this way internally.
Guilherme Blanco Whats your opinion on this BC break?
|Comment by Stan Imbt [ 26/Nov/12 ]|
I don't quite get it. You have moved the code to protect people from themselves? Like people overriding "find()" with a modified copy of the original "find()"-code which would fail with a new version of Doctrine? Did that really happen a lot?
I mean, what could be the problem be with an overridden "find()" doing "$entity = parent::find(...); if (!$entity) throw ...; return $entity;". And this seems like the typical example of why someone would want to override "find()"...
|Comment by Marco Pivetta [ 27/Nov/12 ]|
Stan Imbt why were you assuming that the `find` method on the ObjectManager is just a shortcut to the ObjectRepository's `find`? I think that assumption is wrong.
|Comment by Benjamin Eberlei [ 27/Nov/12 ]|
I close this here for the following reasons:
You may work around this in your application by:
|Comment by Guilherme Blanco [ 27/Nov/12 ]|
Stan Imbt Our point of extension is EntityRepository, not EntityManager.
To fix your problem, I'd suggest you to use composition around EntityManager and create a delegate to EntityRepository on your method find. That would fix your problem.