我有一个Eventbus,它将过滤器名称作为其第一个参数,将Closure作为第二个参数。像这样:
$this->EventBus->subscribe('FilterTestEvent', function(){/*Do Something*/});
它被称为:
$filteredValue = $this->EventBus->filter('FilterTestEvent', $anyValue);
我现在想要的是传递一个数组作为Closure的引用,然后以任何方式更改(此处:添加元素),然后返回一些作为过滤值:
$item_to_change = array('e1' => 'v1', 'e2' => 'v2');
$this->EventBus->subscribe('FilterTestEvent', function(&$item){
$item['new'] = 'LoremIpsum';
return true;
});
$filtered = $this->EventBus->filter('FilterTestEvent', $item_to_change);
现在我希望print_r($item_to_change)
看起来如下:
Array
(
[e1] => v1
[e2] => v2
[new] => LoremIpsum
)
但它看起来像原始数组:
Array
(
[e1] => v1
[e2] => v2
)
eventbus内部存储所有闭包,如果需要,通过call_user_func_array()
调用它们,闭包作为第一个参数,值作为唯一的参数数组元素。
我如何实现其意图?
Eventbus的源代码:http://goo.gl/LAAO7B
答案 0 :(得分:0)
可能这一行:
$filtered = $this->EventBus->filter('FilterTestEvent', $item_to_change);
应该{{1}}一个新的过滤数组,而不是修改原始数组。
所以检查一下:
return
通过修改函数(添加print_r($filtered);
):
&
修改强>
让你的回调返回过滤后的数组:
function filter(&$array){ //Note & mark
$array['new_index'] = "Something new" ;
}
$array = array("a"=> "a");
filter($array); //The function now receives the array by reference, not by value.
var_dump($array); //The array should be modified.
通过引用传递不应该在这里工作,因为在源代码中$this->EventBus->subscribe('FilterTestEvent', function(&$item){
$item['new'] = 'LoremIpsum';
return $item ;
});
变量与另一个值交换并在之后返回。
答案 1 :(得分:0)
确定。我找到了答案。需要更改过滤器函数,以便它接受数组作为值,我可以在其中保存引用。有关详细信息,请参阅Eventbus源代码的修订版1和修订版2,其中:goo.gl/GBocgl