ZF2 Get params in factory

2019-05-23 21:30发布

问题:

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?

回答1:

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


回答2:

Or the following for ZF3:

$container->get('Application')->getMvcEvent()->getRouteMatch()->getParam('whateverYouWant', false);