Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

[BC break] Remove old InjectTemplateListener behavior #139

Merged
merged 1 commit into from
May 31, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 14 additions & 75 deletions src/View/Http/InjectTemplateListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand All @@ -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);
}

/**
Expand All @@ -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
*
Expand Down
31 changes: 15 additions & 16 deletions test/View/InjectTemplateListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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()
Expand All @@ -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()
Expand Down Expand Up @@ -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([
Expand Down Expand Up @@ -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());
}
}