*/
class Tx_Extbase_SignalSlot_Dispatcher implements t3lib_Singleton {
+ /**
+ * @var boolean
+ */
+ protected $isInitialized = FALSE;
+
/**
* @var Tx_Extbase_Object_ObjectManagerInterface
*/
protected $slots = array();
/**
- * Injects the object manager
+ * Initializes this object.
*
- * @param Tx_Extbase_Object_ObjectManagerInterface $objectManager
- * @return void
+ * This methods needs to be used as alternative to inject aspects.
+ * Since this dispatches is used very early when the ObjectManager
+ * is not fully initialized (especially concerning caching framework),
+ * this is the only way.
*/
- public function injectObjectManager(Tx_Extbase_Object_ObjectManagerInterface $objectManager) {
- $this->objectManager = $objectManager;
+ public function initializeObject() {
+ if ($this->isInitialized) {
+ return;
+ }
+
+ $this->objectManager = t3lib_div::makeInstance('Tx_Extbase_Object_ObjectManager');
+
+ $this->isInitialized = TRUE;
}
/**
* @api
*/
public function dispatch($signalClassName, $signalName, array $signalArguments = array()) {
+ $this->initializeObject();
+
if (!isset($this->slots[$signalClassName][$signalName])) {
return;
}
protected $signalSlotDispatcher;
public function setUp() {
- $this->signalSlotDispatcher = new Tx_Extbase_SignalSlot_Dispatcher();
+ $accessibleClassName = $this->buildAccessibleProxy('Tx_Extbase_SignalSlot_Dispatcher');
+ $this->signalSlotDispatcher = new $accessibleClassName();
}
/**
$arguments = array();
$mockSlot = function() use (&$arguments) { $arguments = func_get_args(); };
- $mockObjectManager = $this->getMock('Tx_Extbase_Object_ObjectManagerInterface');
-
$this->signalSlotDispatcher->connect('Foo', 'bar', $mockSlot, NULL, FALSE);
- $this->signalSlotDispatcher->injectObjectManager($mockObjectManager);
$this->signalSlotDispatcher->dispatch('Foo', 'bar', array('foo' => 'bar', 'baz' => 'quux'));
$this->assertSame(array('bar', 'quux'), $arguments);
$mockObjectManager->expects($this->once())->method('isRegistered')->with($slotClassName)->will($this->returnValue(TRUE));
$mockObjectManager->expects($this->once())->method('get')->with($slotClassName)->will($this->returnValue($mockSlot));
- $this->signalSlotDispatcher->injectObjectManager($mockObjectManager);
+ $this->signalSlotDispatcher->_set('objectManager', $mockObjectManager);
+ $this->signalSlotDispatcher->_set('isInitialized', TRUE);
$this->signalSlotDispatcher->connect('Foo', 'emitBar', $slotClassName, 'slot', FALSE);
$this->signalSlotDispatcher->dispatch('Foo', 'emitBar', array('foo' => 'bar', 'baz' => 'quux'));
$mockObjectManager = $this->getMock('Tx_Extbase_Object_ObjectManagerInterface');
$mockObjectManager->expects($this->once())->method('isRegistered')->with('NonExistingClassName')->will($this->returnValue(FALSE));
- $this->signalSlotDispatcher->injectObjectManager($mockObjectManager);
+ $this->signalSlotDispatcher->_set('objectManager', $mockObjectManager);
+ $this->signalSlotDispatcher->_set('isInitialized', TRUE);
$this->signalSlotDispatcher->connect('Foo', 'emitBar', 'NonExistingClassName', 'slot', TRUE);
$this->signalSlotDispatcher->dispatch('Foo', 'emitBar', array());
}
$mockObjectManager->expects($this->once())->method('isRegistered')->with($slotClassName)->will($this->returnValue(TRUE));
$mockObjectManager->expects($this->once())->method('get')->with($slotClassName)->will($this->returnValue($mockSlot));
- $this->signalSlotDispatcher->injectObjectManager($mockObjectManager);
+ $this->signalSlotDispatcher->_set('objectManager', $mockObjectManager);
+ $this->signalSlotDispatcher->_set('isInitialized', TRUE);
$this->signalSlotDispatcher->connect('Foo', 'emitBar', $slotClassName, 'unknownMethodName', TRUE);
$this->signalSlotDispatcher->dispatch('Foo', 'emitBar', array('foo' => 'bar', 'baz' => 'quux'));
$mockObjectManager = $this->getMock('Tx_Extbase_Object_ObjectManagerInterface');
$this->signalSlotDispatcher->connect('SignalClassName', 'methodName', $mockSlot, NULL, TRUE);
- $this->signalSlotDispatcher->injectObjectManager($mockObjectManager);
+ $this->signalSlotDispatcher->_set('objectManager', $mockObjectManager);
+ $this->signalSlotDispatcher->_set('isInitialized', TRUE);
$this->signalSlotDispatcher->dispatch('SignalClassName', 'methodName', array('foo' => 'bar', 'baz' => 'quux'));
$this->assertSame(array('bar', 'quux', 'SignalClassName::methodName'), $arguments);