ZF2在工厂获得参数

时间:2014-07-04 09:37:56

标签: php navigation zend-framework2

我有一个动态类别导航。在导航工厂,我想从路线获得一个参数。我怎么能这样做?

在我看来

<?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)的路线中获取slu ..

    <?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;
        }
    }

或者有更好的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:6)

搜索几个小时,最后在堆栈上询问,现在我在半小时内找到答案。

我只需要在我的工厂广告

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

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

答案 1 :(得分:1)

或ZF3的以下内容:

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