public function testTranslatorIsPassedThroughAssembleMethod() { $translator = new Translator(); $uri = new HttpUri(); $route = $this->getMock('Zend\\Mvc\\Router\\Http\\RouteInterface'); $route->expects($this->once())->method('assemble')->with($this->equalTo(array()), $this->equalTo(array('translator' => $translator, 'text_domain' => 'default', 'uri' => $uri))); $stack = new TranslatorAwareTreeRouteStack(); $stack->addRoute('test', $route); $stack->assemble(array(), array('name' => 'test', 'translator' => $translator, 'uri' => $uri)); }
/** * assemble(): defined by \Zend\Mvc\Router\RouteInterface interface. * * @see \Zend\Mvc\Router\RouteInterface::assemble() * @param array $params * @param array $options * @return mixed * @throws Exception\InvalidArgumentException * @throws Exception\RuntimeException */ public function assemble(array $params = array(), array $options = array()) { // Assuming, this stack can only orrur on top level // TODO is there any way to ensure that this is called only for top level? // get translator $translator = null; if (isset($options['translator'])) { $translator = $options['translator']; } elseif ($this->hasTranslator() && $this->isTranslatorEnabled()) { $translator = $this->getTranslator(); } /* @var $skelletonOptions SkelletonOptions */ $skelletonOptions = $this->getRoutePluginManager()->getServiceLocator()->get(SkelletonOptions::class); $languages = $skelletonOptions->getLanguages(); $oldBase = $this->baseUrl; // save old baseUrl // only add language key when more than one language is supported if (count($languages) > 1) { if (isset($params['locale'])) { // use parameter if provided $locale = $params['locale']; $key = array_search($locale, $languages); // get key for locale } elseif (is_callable(array($translator, 'getLocale'))) { // use getLocale if possible $locale = $translator->getLocale(); $key = array_search($locale, $languages); // get key for locale } if (!empty($key)) { $this->setBaseUrl($oldBase . '/' . $key); // add key to baseUrl } } $res = parent::assemble($params, $options); $this->setBaseUrl($oldBase); // restore baseUrl return $res; }
public function testAssembleRouteWithParameterLocale() { $stack = new TranslatorAwareTreeRouteStack(); $stack->setTranslator($this->translator, 'route'); $stack->addRoute('foo', $this->fooRoute); $this->assertEquals('/de/hauptseite', $stack->assemble(array('locale' => 'de'), array('name' => 'foo/index'))); $this->assertEquals('/en/homepage', $stack->assemble(array('locale' => 'en'), array('name' => 'foo/index'))); }