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