嵌套触发ZF2中的事件

时间:2013-06-01 06:33:16

标签: zend-framework2 eventtrigger

我使用此代码触发事件:

$input = array(1,2,3);
$result = $EventManager->trigger('onChangeArray',$this,array('values'=>$input));
$c = $result->count();
$final = array();
for($i=0; $i<$c; $i++)
    $final = array_merge($final , $result->pop());

我想在attach函数中更改此数组。如果我添加到数组,$ final包含所有值正确;但我想从附加功能中删除$ final中的值。我需要调用attach函数进行嵌套,每次函数调用前一个函数返回的数组。 我使用此代码为BootStrap中的数组添加值:

$SharedManager->attach('Identifier', 'onChangeArray', function($e) {
     $values = $e->getParam('values');
     $values[] = 4 ;
     return $values;
});

如果可能请帮我从阵列中删除。

1 个答案:

答案 0 :(得分:1)

好的,我想我现在明白了。在您使用for循环时,不是从结果集合中获取返回值,而是创建一个包含值的事件对象,并让您的侦听器代替该数组。

$input = array(1,2,3);
$event = new \Zend\EventManager\Event('onChangeArray', $this, array('values' => $input));
$EventManager->trigger($event);

$values = $event->getParam('values');

因为事件是通过引用传递的,所以您的侦听器不需要返回任何内容,只需要对values参数进行操作即可。考虑以下两个侦听器,一个添加,一个从数组中删除。既不直接返回值,也会对values中包含的$event param采取行动

$SharedManager->attach('Identifier', 'onChangeArray', function($e) {
    $values = $e->getParam('values');
    // add value 4 to array
    $values[] = 4 ;
    $e->setParam('values', $values);
});

$SharedManager->attach('Identifier', 'onChangeArray', function($e) {
    $values = $e->getParam('values');
    // remove value of 3 from array
    if (($key = array_search(3, $values)) !== false) {
        unset($values[$key]);
    }
    $e->setParam('values', $values);
});

按照第一步中的指示触发事件后,您会发现事件中的values参数包含最终数组......

// ..
$EventManager->trigger($event);
$values = $event->getParam('values');

\Zend\Debug\Debug::dump($values);
// result
array(3) {
    [0] => int(1)
    [1] => int(2)
    [3] => int(4)
}