Royw Royw - 18 days ago 11
PHP Question

ZF2 Get params in factory

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?

Answer

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");