Skip to content

Commit 66860f3

Browse files
committed
Decouple DataDefinition from service-container
The data definition must not depend on complex objects like our service container.
1 parent 42f597b commit 66860f3

File tree

1 file changed

+36
-4
lines changed

1 file changed

+36
-4
lines changed

src/MetaModels/DcGeneral/Dca/Builder/Builder.php

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use ContaoCommunityAlliance\DcGeneral\Contao\DataDefinition\Definition\Contao2BackendViewDefinitionInterface;
3232
use ContaoCommunityAlliance\DcGeneral\Contao\Dca\ContaoDataProviderInformation;
3333
use ContaoCommunityAlliance\DcGeneral\Data\ModelId;
34+
use ContaoCommunityAlliance\DcGeneral\DataDefinition\ContainerInterface;
3435
use ContaoCommunityAlliance\DcGeneral\DataDefinition\Definition\BasicDefinitionInterface;
3536
use ContaoCommunityAlliance\DcGeneral\DataDefinition\Definition\DataProviderDefinitionInterface;
3637
use ContaoCommunityAlliance\DcGeneral\DataDefinition\Definition\DefaultBasicDefinition;
@@ -72,6 +73,7 @@
7273
use ContaoCommunityAlliance\DcGeneral\DataDefinition\Palette\Legend;
7374
use ContaoCommunityAlliance\DcGeneral\DataDefinition\Palette\Palette;
7475
use ContaoCommunityAlliance\DcGeneral\DataDefinition\Palette\Property;
76+
use ContaoCommunityAlliance\DcGeneral\EnvironmentInterface;
7577
use ContaoCommunityAlliance\DcGeneral\Exception\DcGeneralInvalidArgumentException;
7678
use ContaoCommunityAlliance\DcGeneral\Factory\Event\BuildDataDefinitionEvent;
7779
use ContaoCommunityAlliance\DcGeneral\Factory\Event\PopulateEnvironmentEvent;
@@ -81,6 +83,7 @@
8183
use MetaModels\Attribute\ITranslated;
8284
use MetaModels\BackendIntegration\InputScreen\IInputScreen;
8385
use MetaModels\BackendIntegration\ViewCombinations;
86+
use MetaModels\DcGeneral\Data\Driver;
8487
use MetaModels\DcGeneral\DataDefinition\Definition\MetaModelDefinition;
8588
use MetaModels\DcGeneral\DataDefinition\IMetaModelDataDefinition;
8689
use MetaModels\DcGeneral\DataDefinition\Palette\Condition\Property\IsVariantAttribute;
@@ -199,6 +202,17 @@ public function populate(PopulateEnvironmentEvent $event)
199202
// Trigger BuildAttribute Event.
200203
$dispatcher->dispatch($event::NAME, $event);
201204
}
205+
206+
foreach ([
207+
$environment->getDataDefinition(),
208+
$environment->getParentDataDefinition(),
209+
$environment->getRootDataDefinition()
210+
] as $definition) {
211+
if (!$definition instanceof ContainerInterface) {
212+
continue;
213+
}
214+
$this->injectServiceContainerIntoDataDrivers($definition->getDataProviderDefinition(), $environment);
215+
}
202216
}
203217

204218
/**
@@ -840,8 +854,7 @@ protected function parseDataProvider(IMetaModelDataDefinition $container)
840854
->setTableName($container->getName())
841855
->setClassName('MetaModels\DcGeneral\Data\Driver')
842856
->setInitializationData(array(
843-
'source' => $container->getName(),
844-
'service-container' => $this->serviceContainer
857+
'source' => $container->getName(),
845858
))
846859
->setVersioningEnabled(false);
847860
$container->getBasicDefinition()->setDataProvider($container->getName());
@@ -869,8 +882,7 @@ protected function parseDataProvider(IMetaModelDataDefinition $container)
869882
->setTableName($inputScreen->getParentTable())
870883
->setInitializationData(
871884
array(
872-
'source' => $inputScreen->getParentTable(),
873-
'service-container' => $this->serviceContainer
885+
'source' => $inputScreen->getParentTable(),
874886
)
875887
);
876888

@@ -1546,4 +1558,24 @@ protected function addSelectCommand(Contao2BackendViewDefinitionInterface $view,
15461558

15471559
$commands->addCommand($command);
15481560
}
1561+
1562+
/**
1563+
* Inject the service container into the data driver instances.
1564+
*
1565+
* @param DataProviderDefinitionInterface $providerDefinitions The definitions.
1566+
* @param EnvironmentInterface $environment The environment containing the providers.
1567+
*
1568+
* @return void
1569+
*/
1570+
private function injectServiceContainerIntoDataDrivers($providerDefinitions, $environment)
1571+
{
1572+
foreach ($providerDefinitions as $provider) {
1573+
$providerInstance = $environment->getDataProvider($provider->getName());
1574+
if ($providerInstance instanceof Driver) {
1575+
$providerInstance->setBaseConfig(
1576+
array_merge($provider->getInitializationData(), ['service-container' => $this->serviceContainer])
1577+
);
1578+
}
1579+
}
1580+
}
15491581
}

0 commit comments

Comments
 (0)