У меня динамическая категория навигации. На фабрике навигации я хочу получить параметр с маршрута. Как я могу это сделать?
На мой взгляд
<?php echo $this->navigation('CategoryNavigation')->menu()->setUlClass('list-group'); ?>
В моем module.php:
public function getServiceConfig() { return array( 'factories' => array( 'CategoryNavigation' => 'Application\Navigation\CategoryNavigation', ) ); }
Это моя судоходная фабрика. Мне нужно получить слизню с маршрута, где определен {{store slug}} (2x).
<?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; } }
Или есть лучший способ добиться этого?
Ищите несколько часов, в конце концов спрашивая об этом в стеке, и теперь я нахожу ответ через полчаса.
Мне просто пришлось объявить об этом на моем заводе
$router = $serviceLocator->get('router'); $request = $serviceLocator->get('request'); // Get the router match $routerMatch = $router->match($request); $this->slug = $routerMatch->getParam("slug");
Или для ZF3:
$container->get('Application')->getMvcEvent()->getRouteMatch()->getParam('whateverYouWant', false);