diff --git a/src/View/Http/InjectTemplateListener.php b/src/View/Http/InjectTemplateListener.php index 64073ec83..4f7c79566 100644 --- a/src/View/Http/InjectTemplateListener.php +++ b/src/View/Http/InjectTemplateListener.php @@ -12,7 +12,6 @@ use Zend\EventManager\AbstractListenerAggregate; use Zend\EventManager\EventManagerInterface as Events; use Zend\Mvc\MvcEvent; -use Zend\Mvc\ModuleRouteListener; use Zend\Stdlib\StringUtils; use Zend\View\Model\ModelInterface as ViewModel; @@ -73,28 +72,6 @@ public function injectTemplate(MvcEvent $e) } $template = $this->mapController($controller); - if (!$template) { - $module = $this->deriveModuleNamespace($controller); - - if ($namespace = $routeMatch->getParam(ModuleRouteListener::MODULE_NAMESPACE)) { - $controllerSubNs = $this->deriveControllerSubNamespace($namespace); - if (!empty($controllerSubNs)) { - if (!empty($module)) { - $module .= '/' . $controllerSubNs; - } else { - $module = $controllerSubNs; - } - } - } - - $controller = $this->deriveControllerClass($controller); - $template = $this->inflectName($module); - - if (!empty($template)) { - $template .= '/'; - } - $template .= $this->inflectName($controller); - } $action = $routeMatch->getParam('action'); if (null !== $action) { @@ -124,10 +101,7 @@ public function setControllerMap(array $map) */ public function mapController($controller) { - if (! is_string($controller)) { - return false; - } - + $mapped = ''; foreach ($this->controllerMap as $namespace => $replacement) { if (// Allow disabling rule by setting value to false since config // merging have no feature to remove entries @@ -138,27 +112,26 @@ public function mapController($controller) continue; } - $map = ''; // Map namespace to $replacement if its value is string if (is_string($replacement)) { - $map = rtrim($replacement, '/') . '/'; + $mapped = rtrim($replacement, '/') . '/'; $controller = substr($controller, strlen($namespace) + 1) ?: ''; + break; } + } - //strip Controller namespace(s) (but not classname) - $parts = explode('\\', $controller); - array_pop($parts); - $parts = array_diff($parts, ['Controller']); - //strip trailing Controller in class name - $parts[] = $this->deriveControllerClass($controller); - $controller = implode('/', $parts); + //strip Controller namespace(s) (but not classname) + $parts = explode('\\', $controller); + array_pop($parts); + $parts = array_diff($parts, ['Controller']); + //strip trailing Controller in class name + $parts[] = $this->deriveControllerClass($controller); + $controller = implode('/', $parts); - $template = trim($map . $controller, '/'); + $template = trim($mapped . $controller, '/'); - // inflect CamelCase to dash - return $this->inflectName($template); - } - return false; + // inflect CamelCase to dash + return $this->inflectName($template); } /** @@ -183,40 +156,6 @@ protected function inflectName($name) return strtolower($name); } - /** - * Determine the top-level namespace of the controller - * - * @param string $controller - * @return string - */ - protected function deriveModuleNamespace($controller) - { - if (!strstr($controller, '\\')) { - return ''; - } - $module = substr($controller, 0, strpos($controller, '\\')); - return $module; - } - - /** - * @param $namespace - * @return string - */ - protected function deriveControllerSubNamespace($namespace) - { - if (!strstr($namespace, '\\')) { - return ''; - } - $nsArray = explode('\\', $namespace); - - // Remove the first two elements representing the module and controller directory. - $subNsArray = array_slice($nsArray, 2); - if (empty($subNsArray)) { - return ''; - } - return implode('/', $subNsArray); - } - /** * Determine the name of the controller * diff --git a/test/View/InjectTemplateListenerTest.php b/test/View/InjectTemplateListenerTest.php index 9669c25b9..34466567d 100644 --- a/test/View/InjectTemplateListenerTest.php +++ b/test/View/InjectTemplateListenerTest.php @@ -105,6 +105,18 @@ public function testBypassesTemplateInjectionIfResultViewModelAlreadyHasATemplat $this->assertEquals('custom', $model->getTemplate()); } + public function testMapsSubNamespaceToSubDirectory() + { + $myViewModel = new ViewModel(); + $myController = new \ZendTest\Mvc\Controller\TestAsset\SampleController(); + $this->event->setTarget($myController); + $this->event->setResult($myViewModel); + + $this->listener->injectTemplate($this->event); + + $this->assertEquals('zend-test/mvc/test-asset/sample', $myViewModel->getTemplate()); + } + public function testMapsSubNamespaceToSubDirectoryWithControllerFromRouteMatch() { $this->routeMatch->setParam(ModuleRouteListener::MODULE_NAMESPACE, 'Aj\Controller\SweetAppleAcres\Reports'); @@ -134,7 +146,7 @@ public function testMapsSubNamespaceToSubDirectoryWithControllerFromRouteMatchHa $this->event->setResult($model); $this->listener->injectTemplate($this->event); - $this->assertEquals('aj/sweet-apple-acres/reports/cider-sales/pinkie-pie-revenue', $model->getTemplate()); + $this->assertEquals('aj/sweet-apple-acres/reports/sub/cider-sales/pinkie-pie-revenue', $model->getTemplate()); } public function testMapsSubNamespaceToSubDirectoryWithControllerFromEventTarget() @@ -152,7 +164,7 @@ public function testMapsSubNamespaceToSubDirectoryWithControllerFromEventTarget( $this->event->setResult($myViewModel); $this->listener->injectTemplate($this->event); - $this->assertEquals('zend-test/controller/test-asset/sample/test', $myViewModel->getTemplate()); + $this->assertEquals('zend-test/mvc/test-asset/sample/test', $myViewModel->getTemplate()); } public function testMapsSubNamespaceToSubDirectoryWithControllerFromEventTargetShouldMatchControllerFromRouteParam() @@ -201,19 +213,6 @@ public function testControllerMatchedByMapIsInflected() $this->assertEquals('zend-test/mvc/test-asset/sample', $myViewModel->getTemplate()); } - public function testControllerNotMatchedByMapIsNotAffected() - { - $this->routeMatch->setParam('action', 'test'); - $myViewModel = new ViewModel(); - $myController = new \ZendTest\Mvc\Controller\TestAsset\SampleController(); - - $this->event->setTarget($myController); - $this->event->setResult($myViewModel); - $this->listener->injectTemplate($this->event); - - $this->assertEquals('zend-test/sample/test', $myViewModel->getTemplate()); - } - public function testFullControllerNameMatchIsMapped() { $this->listener->setControllerMap([ @@ -339,6 +338,6 @@ public function testPrefersRouteMatchController() $this->event->setResult($myViewModel); $this->listener->injectTemplate($this->event); - $this->assertEquals('some/sample', $myViewModel->getTemplate()); + $this->assertEquals('some/other/service/namespace/sample', $myViewModel->getTemplate()); } }