Skip to content

Commit 7f5ba91

Browse files
author
Jon Acker
committed
Merge branch 'master' of github.com:inviqa/magento-symfony-container
2 parents 6b52128 + 81dd781 commit 7f5ba91

File tree

5 files changed

+84
-7
lines changed

5 files changed

+84
-7
lines changed

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,31 @@ To provide dependencies to other classes after they are instantiated, in additio
193193
parent::__construct();
194194
}
195195
```
196+
197+
### Registering your own compiler pass
198+
199+
Create a [custom compiler pass](https://github.com/inviqa/magento-symfony-container/blob/master/app/code/community/Inviqa/SymfonyContainer/Model/InjectableCompilerPass.php) class in your project.
200+
201+
Create a Magento observer and configure it to listen to the `symfony_container_before_container_generator` Magento event.
202+
Update this observer to inject the custom compiler pass into the generator config, as shown below:
203+
204+
```php
205+
class Inviqa_DependencyInjection_Model_Observer
206+
{
207+
/** @var CustomCompilerPass */
208+
private $customCompilerPass;
209+
210+
public function __construct()
211+
{
212+
$this->customCompilerPass = new CustomCompilerPass();
213+
}
214+
215+
public function onBeforeContainerGenerator(Varien_Event_Observer $observer)
216+
{
217+
/** @var Configuration $generatorConfig */
218+
$generatorConfig = $observer->getData('generator_config');
219+
220+
$generatorConfig->addCompilerPass($this->customCompilerPass);
221+
}
222+
}
223+
```

app/code/community/Bridge/MageApp.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ interface MageApp
66
public function useCache($model);
77

88
public function getStore($id = null);
9+
10+
public function dispatchEvent($eventName, $args);
911
}

app/code/community/Inviqa/SymfonyContainer/Helper/ContainerProvider.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@
22

33
use ContainerTools\Configuration;
44
use ContainerTools\ContainerGenerator;
5+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
56
use Symfony\Component\DependencyInjection\Container;
7+
use Bridge\MageApp;
68

79
class Inviqa_SymfonyContainer_Helper_ContainerProvider
810
{
911
const HELPER_NAME = 'inviqa_symfonyContainer/containerProvider';
1012

13+
/**
14+
* @var Mage_Core_Model_App
15+
*/
16+
private $_mageApp;
17+
1118
/**
1219
* @var Container
1320
*/
@@ -22,14 +29,15 @@ class Inviqa_SymfonyContainer_Helper_ContainerProvider
2229
* @var CompilerPassInterface
2330
*/
2431
private $_storeConfigCompilerPass;
25-
2632
/**
2733
* @var CompilerPassInterface
2834
*/
2935
private $_injectableCompilerPass;
3036

3137
public function __construct(array $services = array())
3238
{
39+
$this->_mageApp = isset($services['app']) ? $services['app'] : Mage::app();
40+
3341
$this->_generatorConfig = isset($services['generatorConfig']) ?
3442
$services['generatorConfig'] :
3543
Mage::getModel('inviqa_symfonyContainer/configurationBuilder')->build();
@@ -59,6 +67,11 @@ private function _buildContainer()
5967
$this->_generatorConfig->addCompilerPass($this->_storeConfigCompilerPass);
6068
$this->_generatorConfig->addCompilerPass($this->_injectableCompilerPass);
6169

70+
$this->_mageApp->dispatchEvent(
71+
'symfony_container_before_container_generator',
72+
['generator_config' => $this->_generatorConfig]
73+
);
74+
6275
$generator = new ContainerGenerator($this->_generatorConfig);
6376

6477
return $this->_container = $generator->getContainer();

app/code/community/Inviqa/SymfonyContainer/Model/Observer.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,21 @@ class Inviqa_SymfonyContainer_Model_Observer
77
{
88
use Inviqa_SymfonyContainer_Helper_ServiceProvider;
99

10+
const CACHE_META_SUFFIX = '.meta';
1011
const SERVICE_INJECTOR = 'inviqa_symfonyContainer/serviceInjector';
1112

1213
public function onCacheRefresh(Varien_Event_Observer $event)
1314
{
1415
if (ConfigurationBuilder::MODEL_ALIAS === $event->getType()) {
15-
$filePath = Mage::getBaseDir('cache') . '/' . ConfigurationBuilder::CACHED_CONTAINER;
16-
if (file_exists($filePath)) {
17-
unlink($filePath);
16+
$containerFilePath = $this->containerCachePath();
17+
$metaFilePath = $this->containerCacheMetaPath();
18+
19+
if (file_exists($containerFilePath)) {
20+
unlink($containerFilePath);
21+
}
22+
23+
if (file_exists($metaFilePath)) {
24+
unlink($metaFilePath);
1825
}
1926
}
2027
}
@@ -26,4 +33,14 @@ public function onPreDispatch(Varien_Event_Observer $event)
2633
'container' => Mage::helper(ContainerProvider::HELPER_NAME)->getContainer()
2734
])->setupDependencies($controller);
2835
}
36+
37+
private function containerCachePath()
38+
{
39+
return Mage::getBaseDir('cache') . DIRECTORY_SEPARATOR . ConfigurationBuilder::CACHED_CONTAINER;
40+
}
41+
42+
private function containerCacheMetaPath()
43+
{
44+
return $this->containerCachePath() . self::CACHE_META_SUFFIX;
45+
}
2946
}

app/code/spec/Inviqa/SymfonyContainer/Helper/ContainerProviderSpec.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
use Inviqa_SymfonyContainer_Model_StoreConfigCompilerPass as StoreConfigCompilerPass;
77
use Inviqa_SymfonyContainer_Model_InjectableCompilerPass as InjectableCompilerPass;
88
use Symfony\Component\DependencyInjection\Container;
9+
use Bridge\MageApp;
910

1011
use PhpSpec\ObjectBehavior;
1112
use Prophecy\Argument;
1213

1314
class Inviqa_SymfonyContainer_Helper_ContainerProviderSpec extends ObjectBehavior
1415
{
15-
function let(Configuration $generatorConfig, StoreConfigCompilerPass $configCompilerPass, InjectableCompilerPass $injectableCompilerPass)
16+
function let(
17+
MageApp $app,
18+
Configuration $generatorConfig,
19+
StoreConfigCompilerPass $configCompilerPass,
20+
InjectableCompilerPass $injectableCompilerPass
21+
)
1622
{
1723
$generatorConfig->getContainerFilePath()->willReturn('container.php');
1824
$generatorConfig->getDebug()->willReturn(true);
@@ -22,6 +28,7 @@ function let(Configuration $generatorConfig, StoreConfigCompilerPass $configComp
2228
$generatorConfig->isTestEnvironment()->willReturn(false);
2329

2430
$services = [
31+
'app' => $app,
2532
'generatorConfig' => $generatorConfig,
2633
'storeConfigCompilerPass' => $configCompilerPass,
2734
'injectableCompilerPass' => $injectableCompilerPass
@@ -30,18 +37,28 @@ function let(Configuration $generatorConfig, StoreConfigCompilerPass $configComp
3037
$this->beConstructedWith($services);
3138
}
3239

33-
function it_generates_container(Configuration $generatorConfig)
40+
function it_generates_the_container(Configuration $generatorConfig)
3441
{
3542
$generatorConfig->addCompilerPass(Argument::any())->shouldBeCalled();
3643

3744
$this->getContainer()->shouldBeAnInstanceOf(Container::class);
3845
}
3946

40-
function it_memoizes_container(Configuration $generatorConfig, StoreConfigCompilerPass $configCompilerPass, InjectableCompilerPass $injectableCompilerPass)
47+
function it_memoizes_the_container(
48+
MageApp $app,
49+
Configuration $generatorConfig,
50+
StoreConfigCompilerPass $configCompilerPass,
51+
InjectableCompilerPass $injectableCompilerPass
52+
)
4153
{
4254
$generatorConfig->addCompilerPass($configCompilerPass)->shouldBeCalledTimes(1);
4355
$generatorConfig->addCompilerPass($injectableCompilerPass)->shouldBeCalledTimes(1);
4456

57+
$app->dispatchEvent(
58+
'symfony_container_before_container_generator',
59+
['generator_config' => $generatorConfig]
60+
)->shouldBeCalled();
61+
4562
$container = $this->getContainer();
4663
$this->getContainer()->shouldBe($container);
4764
}

0 commit comments

Comments
 (0)