1- How to Define Relationships with Abstract Classes and Interfaces
2- ================================================================
1+ Referencing Entities with Abstract Classes and Interfaces
2+ =========================================================
33
4- One of the goals of bundles is to create discrete bundles of functionality
5- that do not have many (if any) dependencies, allowing you to use that
6- functionality in other applications without including unnecessary items .
4+ In applications where functionality is segregated with minimal concrete dependencies
5+ between the various layers, such as monoliths which are split into multiple modules,
6+ it might be hard to prevent hard dependencies on entities between modules .
77
88Doctrine 2.2 includes a new utility called the ``ResolveTargetEntityListener ``,
99that functions by intercepting certain calls inside Doctrine and rewriting
1010``targetEntity `` parameters in your metadata mapping at runtime. It means that
11- in your bundle you are able to use an interface or abstract class in your
12- mappings and expect correct mapping to a concrete entity at runtime.
11+ you are able to use an interface or abstract class in your mappings and expect
12+ correct mapping to a concrete entity at runtime.
1313
1414This functionality allows you to define relationships between different entities
1515without making them hard dependencies.
@@ -22,14 +22,14 @@ without making them hard dependencies.
2222Background
2323----------
2424
25- Suppose you have an InvoiceBundle which provides invoicing functionality
26- and a CustomerBundle that contains customer management tools. You want
27- to keep these separated, because they can be used in other systems without
28- each other, but for your application you want to use them together .
25+ Suppose you have an application which provides two modules; an Invoice module which
26+ provides invoicing functionality, and a Customer module that contains customer management
27+ tools. You want to keep dependencies between these modules separated, because they should
28+ not be aware of the other module's implementation details .
2929
30- In this case, you have an ``Invoice `` entity with a relationship to a
31- non-existent object, an ``InvoiceSubjectInterface ``. The goal is to get
32- the ``ResolveTargetEntityListener `` to replace any mention of the interface
30+ In this case, you have an ``Invoice `` entity with a relationship to the interface
31+ ``InvoiceSubjectInterface ``. This is not recognized as a valid entity by Doctrine.
32+ The goal is to get the ``ResolveTargetEntityListener `` to replace any mention of the interface
3333with a real object that implements that interface.
3434
3535Set up
@@ -94,7 +94,7 @@ An InvoiceSubjectInterface::
9494 public function getName(): string;
9595 }
9696
97- Next, you need to configure the listener , which tells the DoctrineBundle
97+ Next, you need to configure the `` resolve_target_entities `` option , which tells the DoctrineBundle
9898about the replacement:
9999
100100.. configuration-block ::
@@ -146,6 +146,6 @@ Final Thoughts
146146--------------
147147
148148With the ``ResolveTargetEntityListener ``, you are able to decouple your
149- bundles , keeping them usable by themselves, but still being able to
149+ modules , keeping them usable by themselves, but still being able to
150150define relationships between different objects. By using this method,
151- your bundles will end up being easier to maintain independently.
151+ your modules will end up being easier to maintain independently.
0 commit comments