1
- How to Define Relationships with Abstract Classes and Interfaces
2
- ================================================================
1
+ Referencing Entities with Abstract Classes and Interfaces
2
+ =========================================================
3
3
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 .
7
7
8
8
Doctrine 2.2 includes a new utility called the ``ResolveTargetEntityListener ``,
9
9
that functions by intercepting certain calls inside Doctrine and rewriting
10
10
``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.
13
13
14
14
This functionality allows you to define relationships between different entities
15
15
without making them hard dependencies.
@@ -22,14 +22,14 @@ without making them hard dependencies.
22
22
Background
23
23
----------
24
24
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 .
29
29
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
33
33
with a real object that implements that interface.
34
34
35
35
Set up
@@ -94,7 +94,7 @@ An InvoiceSubjectInterface::
94
94
public function getName(): string;
95
95
}
96
96
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
98
98
about the replacement:
99
99
100
100
.. configuration-block ::
@@ -146,6 +146,6 @@ Final Thoughts
146
146
--------------
147
147
148
148
With 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
150
150
define 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