Вложенный запуск событий в ZF2

я использую этот код для запуска события:

$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());

я хочу изменить этот массив в функции присоединения. если я добавляю в массив, $final содержит все значения правильно; но я хочу удалить значение из $final в функции присоединения. мне нужно вызывать функции прикрепления для вложения, которые каждый раз вызывают функцию с возвращаемым массивом из предыдущей функции. я использую этот код для добавления значения в массив в BootStrap:

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

если возможно, пожалуйста, помогите мне удалить из массива.


person Mohammad Mehdi Habibi    schedule 01.06.2013    source источник
comment
Я не уверен, что понимаю вопрос. Вы просто хотите знать, как удалить значение из массива значений?   -  person Crisp    schedule 01.06.2013


Ответы (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, который им дали.

$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)
}
person Crisp    schedule 01.06.2013