<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Mvc\View\Console;
use ArrayAccess;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\View\Http\ViewManager as BaseViewManager;
/**
* Prepares the view layer for console applications
*/
class ViewManager extends BaseViewManager
{
/**
* Prepares the view layer
*
* Overriding, as several operations are omitted in the console view
* algorithms, as well as to ensure we pick up the Console variants
* of several listeners and strategies.
*
* @param $event
* @return void
*/
public function onBootstrap($event)
{
$application = $event->getApplication();
$services = $application->getServiceManager();
$config = $services->get('Config');
$events = $application->getEventManager();
$sharedEvents = $events->getSharedManager();
$this->config = isset($config['view_manager']) && (is_array($config['view_manager']) || $config['view_manager'] instanceof ArrayAccess)
? $config['view_manager']
: array();
$this->services = $services;
$this->event = $event;
$routeNotFoundStrategy = $this->getRouteNotFoundStrategy();
$exceptionStrategy = $this->getExceptionStrategy();
$mvcRenderingStrategy = $this->getMvcRenderingStrategy();
$createViewModelListener = new CreateViewModelListener();
$injectViewModelListener = new InjectViewModelListener();
$injectParamsListener = new InjectNamedConsoleParamsListener();
$this->registerMvcRenderingStrategies($events);
$this->registerViewStrategies();
$events->attach($routeNotFoundStrategy);
$events->attach($exceptionStrategy);
$events->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($injectViewModelListener, 'injectViewModel'), -100);
$events->attach(MvcEvent::EVENT_RENDER_ERROR, array($injectViewModelListener, 'injectViewModel'), -100);
$events->attach($mvcRenderingStrategy);
$sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, array($injectParamsListener, 'injectNamedParams'), 1000);
$sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, array($createViewModelListener, 'createViewModelFromArray'), -80);
$sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, array($createViewModelListener, 'createViewModelFromString'), -80);
$sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, array($createViewModelListener, 'createViewModelFromNull'), -80);
$sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, array($injectViewModelListener, 'injectViewModel'), -100);
}
/**
* Instantiates and configures the default MVC rendering strategy
*
* Overriding to ensure we pick up the MVC rendering strategy for console,
* as well as to ensure that the appropriate aliases are set.
*
* @return DefaultRenderingStrategy
*/
public function getMvcRenderingStrategy()
{
if ($this->mvcRenderingStrategy) {
return $this->mvcRenderingStrategy;
}
$this->mvcRenderingStrategy = new DefaultRenderingStrategy();
$this->services->setService('DefaultRenderingStrategy', $this->mvcRenderingStrategy);
$this->services->setAlias('Zend\Mvc\View\DefaultRenderingStrategy', 'DefaultRenderingStrategy');
$this->services->setAlias('Zend\Mvc\View\Console\DefaultRenderingStrategy', 'DefaultRenderingStrategy');
return $this->mvcRenderingStrategy;
}
/**
* Instantiates and configures the exception strategy
*
* Overriding to ensure we pick up the exception strategy for console, as
* well as to ensure that the appropriate aliases are set.
*
* @return ExceptionStrategy
*/
public function getExceptionStrategy()
{
if ($this->exceptionStrategy) {
return $this->exceptionStrategy;
}
$this->exceptionStrategy = new ExceptionStrategy();
if (isset($this->config['display_exceptions'])) {
$this->exceptionStrategy->setDisplayExceptions($this->config['display_exceptions']);
}
if (isset($this->config['exception_message'])) {
$this->exceptionStrategy->setMessage($this->config['exception_message']);
}
$this->services->setService('ExceptionStrategy', $this->exceptionStrategy);
$this->services->setAlias('Zend\Mvc\View\ExceptionStrategy', 'ExceptionStrategy');
$this->services->setAlias('Zend\Mvc\View\Console\ExceptionStrategy', 'ExceptionStrategy');
return $this->exceptionStrategy;
}
/**
* Instantiates and configures the "route not found", or 404, strategy
*
* Overriding to ensure we pick up the route not found strategy for console,
* as well as to ensure that the appropriate aliases are set.
*
* @return RouteNotFoundStrategy
*/
public function getRouteNotFoundStrategy()
{
if ($this->routeNotFoundStrategy) {
return $this->routeNotFoundStrategy;
}
$this->routeNotFoundStrategy = new RouteNotFoundStrategy();
$displayNotFoundReason = true;
if (array_key_exists('display_not_found_reason', $this->config)) {
$displayNotFoundReason = $this->config['display_not_found_reason'];
}
$this->routeNotFoundStrategy->setDisplayNotFoundReason($displayNotFoundReason);
$this->services->setService('RouteNotFoundStrategy', $this->routeNotFoundStrategy);
$this->services->setAlias('Zend\Mvc\View\RouteNotFoundStrategy', 'RouteNotFoundStrategy');
$this->services->setAlias('Zend\Mvc\View\Console\RouteNotFoundStrategy', 'RouteNotFoundStrategy');
$this->services->setAlias('404Strategy', 'RouteNotFoundStrategy');
return $this->routeNotFoundStrategy;
}
}