ZF2 Get params in factory

navigation, php, zend-framework2

Solution

Searching for a few hours, in the end asking it on stack, and now I find the answer in a half hour.

I just had to ad this in my factory

$router = $serviceLocator->get('router');
$request = $serviceLocator->get('request');

// Get the router match
$routerMatch = $router->match($request);
$this->slug = $routerMatch->getParam("slug");

Problem

I have a dynamic category navigation. In the navigation factory I want to get a param from the route. How can I do this? In my view ``` <?php echo $this->navigation('CategoryNavigation')->menu()->setUlClass('list-group'); ?> ``` In my module.php: ``` public function getServiceConfig() { return array( 'factories' => array( 'CategoryNavigation' => 'Application\Navigation\CategoryNavigation', ) ); } ``` This is my navigation factory. I need to get the slug from the route where {{ store slug }} (2x) is defined. ``` <?php namespace Application\Navigation; use Zend\ServiceManager\ServiceLocator; use Zend\ServiceManager\ServiceLocatorInterface; use Zend\Navigation\Service\DefaultNavigationFactory; class CategoryNavigation extends DefaultNavigationFactory { protected $sl; protected function getPages(ServiceLocatorInterface $serviceLocator) { if (null === $this->pages) { $em = $serviceLocator->get('Doctrine\ORM\EntityManager'); $storerepository = $em->getRepository('ApplicationShared\Entity\Store'); $store = $storerepository->findOneBy(array('slug' => '{{ store slug }}')); $fetchMenu = $store->getCategories(); $configuration['navigation'][$this->getName()] = $this->buildNavigation($fetchMenu); if (!isset($configuration['navigation'])) { throw new Exception\InvalidArgumentException('Could not find navigation configuration key'); } if (!isset($configuration['navigation'][$this->getName()])) { throw new Exception\InvalidArgumentException(sprintf( 'Failed to find a navigation container by the name "%s"', $this->getName() )); } $application = $serviceLocator->get('Application'); $routeMatch = $application->getMvcEvent()->getRouteMatch(); $router = $application->getMvcEvent()->getRouter(); $pages = $this->getPagesFromConfig($configuration['navigation'][$this->getName()]); // $this->pages = $this->injectComponents($pages, $routeMatch, $router); } return $this->pages; } protected function buildNavigation($elements, $parentid = null){ foreach ($elements as $index => $element) { if (!$element->getParent()) { $branch[$element->getCategoryName()] = $this->navigationItem($element); } } return $branch; } protected function navigationItem($element){ $branch['label'] = $element->getCategoryName(); $branch['route'] = 'store/type/catalog'; $branch['params'] = array('slug' => '{{ store slug }}','category' => $element->getSlug()); if(count($element->getChildren()) > 0){ foreach($element->getChildren() as $element){ $branch['pages'][] = $this->navigationItem($element); } } return $branch; } } ``` Or are there better way's to achieve this?

Original source