Bug: Navigation Helper - isAllowed function - ACLlistener is Attached Several Times #129
Description
Here is a fun bug for you all.
Everytime you instantiate a new Navigation Helper the the same Listener is attached to the shared Manager once again.
file: https://github.com/zendframework/zend-view/blob/master/src/Helper/Navigation/AbstractHelper.php
protected function setDefaultListeners()
{
if (! $this->getUseAcl()) {
return;
}
$events = $this->getEventManager() ?: $this->createEventManager();
if (! $events->getSharedManager()) {
return;
}
$events->getSharedManager()->attach(
'Zend\View\Helper\Navigation\AbstractHelper',
'isAllowed',
['Zend\View\Helper\Navigation\Listener\AclListener', 'accept']
);
}
so if you do
echo $this->navigation('Name')->menu();
echo $this->navigation('Name')->breadcrumbs();
Then the same AclListener function will be attached 3 times
- one on ->navigation
- another on ->menu
- and the last on -> breadcrumbs
It means that everytime the "isAllowed" function is called (it is called a LOT) then the AclListener function is called X times (3 times in my example).........
To fix this issue I believe that Zend View should not be in charge of registering any event
So my fix would be to get rid of this function altogether.
The Acl Listener should be moved the the zend-acl repository
And it should be the user responsibility to register any event on the isAllowed function.