1 | <?php |
||
30 | class ResourceConfiguration implements ConfigurationInterface |
||
31 | { |
||
32 | /** |
||
33 | * @var ResourceBundleInterface |
||
34 | */ |
||
35 | private $bundle; |
||
36 | |||
37 | /** |
||
38 | * @param ResourceBundleInterface $bundle |
||
39 | */ |
||
40 | 7 | public function __construct(ResourceBundleInterface $bundle) |
|
44 | |||
45 | /** |
||
46 | * {@inheritdoc} |
||
47 | */ |
||
48 | 7 | public function getConfigTreeBuilder() |
|
58 | |||
59 | /** |
||
60 | * @param NodeBuilder $builder |
||
61 | */ |
||
62 | protected function configureBundle(NodeBuilder $builder) |
||
65 | |||
66 | /** |
||
67 | * @return ArrayNodeDefinition |
||
68 | */ |
||
69 | 7 | private function createResourceNodes() |
|
80 | |||
81 | /** |
||
82 | * @param ResourceInterface $resource |
||
83 | * @param string|null $name |
||
84 | * |
||
85 | * @return ArrayNodeDefinition |
||
86 | */ |
||
87 | 7 | private function createResourceNode(ResourceInterface $resource, $name = null) |
|
88 | { |
||
89 | 7 | $resourceNode = $this->createNode($name ?: $resource->getName())->addDefaultsIfNotSet(); |
|
90 | 7 | $childrenNode = $resourceNode->children() |
|
91 | 7 | ->append($this->createClassNode( |
|
92 | 7 | 'model', |
|
93 | 7 | $resource->getModel(), |
|
94 | 7 | $resource->getInterfaces(), |
|
95 | true |
||
96 | 7 | )) |
|
97 | 7 | ->append($this->createDriverNode($resource)) |
|
98 | 7 | ->append($this->createClassNode( |
|
99 | 7 | 'repository', |
|
100 | 7 | $resource->getRepository(), |
|
101 | 7 | [RepositoryInterface::class] |
|
102 | 7 | )) |
|
103 | 7 | ->append($this->createClassNode( |
|
104 | 7 | 'factory', |
|
105 | 7 | $resource->getFactory(), |
|
106 | 7 | [FactoryInterface::class] |
|
107 | 7 | )) |
|
108 | 7 | ->append($this->createClassNode( |
|
109 | 7 | 'form', |
|
110 | 7 | $resource->getForm(), |
|
111 | 7 | [FormTypeInterface::class] |
|
112 | 7 | )) |
|
113 | 7 | ->append($this->createClassNode( |
|
114 | 7 | 'choice_form', |
|
115 | 7 | $resource->getChoiceForm(), |
|
116 | 7 | [FormTypeInterface::class] |
|
117 | 7 | )) |
|
118 | 7 | ->append($this->createClassNode( |
|
119 | 7 | 'domain_manager', |
|
120 | 7 | $resource->getDomainManager(), |
|
121 | 7 | [DomainManagerInterface::class] |
|
122 | 7 | )) |
|
123 | 7 | ->append($this->createClassNode( |
|
124 | 7 | 'controller', |
|
125 | 7 | $resource->getController(), |
|
126 | 7 | [ControllerInterface::class] |
|
127 | 7 | )) |
|
128 | 7 | ->append($this->createNode('id_property_path', 'scalar', $resource->getIdPropertyPath())) |
|
129 | 7 | ->append($this->createNode('label_property_path', 'scalar', $resource->getLabelPropertyPath())); |
|
130 | |||
131 | 7 | foreach ($resource->getRelations() as $name => $relation) { |
|
132 | $childrenNode->append($this->createResourceNode($relation, $name)); |
||
133 | 7 | } |
|
134 | |||
135 | 7 | return $resourceNode; |
|
136 | } |
||
137 | |||
138 | /** |
||
139 | * @param ResourceInterface $resource |
||
140 | * |
||
141 | * @return ArrayNodeDefinition |
||
142 | */ |
||
143 | 7 | private function createDriverNode(ResourceInterface $resource) |
|
153 | |||
154 | /** |
||
155 | * @param ResourceInterface $resource |
||
156 | * |
||
157 | * @return ArrayNodeDefinition |
||
158 | */ |
||
159 | 7 | private function createDriverMappingNode(ResourceInterface $resource) |
|
168 | |||
169 | /** |
||
170 | * @param string $name |
||
171 | * @param string $class |
||
172 | * @param string[] $interfaces |
||
173 | * @param bool $required |
||
174 | * |
||
175 | * @return NodeDefinition |
||
176 | */ |
||
177 | private function createClassNode($name, $class, array $interfaces = [], $required = false) |
||
199 | |||
200 | /** |
||
201 | * @param string $name |
||
202 | * @param string $type |
||
203 | * @param mixed $default |
||
204 | * @param callable|null $if |
||
205 | * @param string|null $then |
||
206 | * |
||
207 | * @return ArrayNodeDefinition|NodeDefinition |
||
208 | */ |
||
209 | 7 | private function createNode($name, $type = 'array', $default = null, $if = null, $then = null) |
|
223 | |||
224 | /** |
||
225 | * @return TreeBuilder |
||
226 | */ |
||
227 | 7 | private function createTreeBuilder() |
|
231 | } |
||
232 |
Let’s take a look at an example:
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.
Available Fixes
Change the type-hint for the parameter:
Add an additional type-check:
Add the method to the parent class: