<?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\Controller;
use Zend\EventManager\EventInterface as Event;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
use Zend\EventManager\EventManagerInterface;
use Zend\Http\PhpEnvironment\Response as HttpResponse;
use Zend\Http\Request as HttpRequest;
use Zend\Mvc\InjectApplicationEventInterface;
use Zend\Mvc\MvcEvent;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Stdlib\DispatchableInterface as Dispatchable;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Stdlib\ResponseInterface as Response;
/**
* Abstract controller
*
* Convenience methods for pre-built plugins (@see __call):
*
* @method \Zend\View\Model\ModelInterface acceptableViewModelSelector(array $matchAgainst = null, bool $returnDefault = true, \Zend\Http\Header\Accept\FieldValuePart\AbstractFieldValuePart $resultReference = null)
* @method bool|array|\Zend\Http\Response fileprg(\Zend\Form\Form $form, $redirect = null, $redirectToUrl = false)
* @method bool|array|\Zend\Http\Response filePostRedirectGet(\Zend\Form\Form $form, $redirect = null, $redirectToUrl = false)
* @method \Zend\Mvc\Controller\Plugin\FlashMessenger flashMessenger()
* @method \Zend\Mvc\Controller\Plugin\Forward forward()
* @method mixed|null identity()
* @method \Zend\Mvc\Controller\Plugin\Layout|\Zend\View\Model\ModelInterface layout(string $template = null)
* @method \Zend\Mvc\Controller\Plugin\Params|mixed params(string $param = null, mixed $default = null)
* @method \Zend\Http\Response|array prg(string $redirect = null, bool $redirectToUrl = false)
* @method \Zend\Http\Response|array postRedirectGet(string $redirect = null, bool $redirectToUrl = false)
* @method \Zend\Mvc\Controller\Plugin\Redirect redirect()
* @method \Zend\Mvc\Controller\Plugin\Url url()
*/
abstract class AbstractController implements
Dispatchable,
EventManagerAwareInterface,
InjectApplicationEventInterface,
ServiceLocatorAwareInterface
{
/**
* @var PluginManager
*/
protected $plugins;
/**
* @var Request
*/
protected $request;
/**
* @var Response
*/
protected $response;
/**
* @var Event
*/
protected $event;
/**
* @var EventManagerInterface
*/
protected $events;
/**
* @var ServiceLocatorInterface
*/
protected $serviceLocator;
/**
* @var string
*/
protected $eventIdentifier;
/**
* Execute the request
*
* @param MvcEvent $e
* @return mixed
*/
abstract public function onDispatch(MvcEvent $e);
/**
* Dispatch a request
*
* @events dispatch.pre, dispatch.post
* @param Request $request
* @param null|Response $response
* @return Response|mixed
*/
public function dispatch(Request $request, Response $response = null)
{
$this->request = $request;
if (!$response) {
$response = new HttpResponse();
}
$this->response = $response;
$e = $this->getEvent();
$e->setRequest($request)
->setResponse($response)
->setTarget($this);
$result = $this->getEventManager()->trigger(MvcEvent::EVENT_DISPATCH, $e, function ($test) {
return ($test instanceof Response);
});
if ($result->stopped()) {
return $result->last();
}
return $e->getResult();
}
/**
* Get request object
*
* @return Request
*/
public function getRequest()
{
if (!$this->request) {
$this->request = new HttpRequest();
}
return $this->request;
}
/**
* Get response object
*
* @return Response
*/
public function getResponse()
{
if (!$this->response) {
$this->response = new HttpResponse();
}
return $this->response;
}
/**
* Set the event manager instance used by this context
*
* @param EventManagerInterface $events
* @return AbstractController
*/
public function setEventManager(EventManagerInterface $events)
{
$events->setIdentifiers(array(
'Zend\Stdlib\DispatchableInterface',
__CLASS__,
get_class($this),
$this->eventIdentifier,
substr(get_class($this), 0, strpos(get_class($this), '\\'))
));
$this->events = $events;
$this->attachDefaultListeners();
return $this;
}
/**
* Retrieve the event manager
*
* Lazy-loads an EventManager instance if none registered.
*
* @return EventManagerInterface
*/
public function getEventManager()
{
if (!$this->events) {
$this->setEventManager(new EventManager());
}
return $this->events;
}
/**
* Set an event to use during dispatch
*
* By default, will re-cast to MvcEvent if another event type is provided.
*
* @param Event $e
* @return void
*/
public function setEvent(Event $e)
{
if (!$e instanceof MvcEvent) {
$eventParams = $e->getParams();
$e = new MvcEvent();
$e->setParams($eventParams);
unset($eventParams);
}
$this->event = $e;
}
/**
* Get the attached event
*
* Will create a new MvcEvent if none provided.
*
* @return MvcEvent
*/
public function getEvent()
{
if (!$this->event) {
$this->setEvent(new MvcEvent());
}
return $this->event;
}
/**
* Set serviceManager instance
*
* @param ServiceLocatorInterface $serviceLocator
* @return void
*/
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
/**
* Retrieve serviceManager instance
*
* @return ServiceLocatorInterface
*/
public function getServiceLocator()
{
return $this->serviceLocator;
}
/**
* Get plugin manager
*
* @return PluginManager
*/
public function getPluginManager()
{
if (!$this->plugins) {
$this->setPluginManager(new PluginManager());
}
$this->plugins->setController($this);
return $this->plugins;
}
/**
* Set plugin manager
*
* @param PluginManager $plugins
* @return AbstractController
*/
public function setPluginManager(PluginManager $plugins)
{
$this->plugins = $plugins;
$this->plugins->setController($this);
return $this;
}
/**
* Get plugin instance
*
* @param string $name Name of plugin to return
* @param null|array $options Options to pass to plugin constructor (if not already instantiated)
* @return mixed
*/
public function plugin($name, array $options = null)
{
return $this->getPluginManager()->get($name, $options);
}
/**
* Method overloading: return/call plugins
*
* If the plugin is a functor, call it, passing the parameters provided.
* Otherwise, return the plugin instance.
*
* @param string $method
* @param array $params
* @return mixed
*/
public function __call($method, $params)
{
$plugin = $this->plugin($method);
if (is_callable($plugin)) {
return call_user_func_array($plugin, $params);
}
return $plugin;
}
/**
* Register the default events for this controller
*
* @return void
*/
protected function attachDefaultListeners()
{
$events = $this->getEventManager();
$events->attach(MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'));
}
/**
* Transform an "action" token into a method name
*
* @param string $action
* @return string
*/
public static function getMethodFromAction($action)
{
$method = str_replace(array('.', '-', '_'), ' ', $action);
$method = ucwords($method);
$method = str_replace(' ', '', $method);
$method = lcfirst($method);
$method .= 'Action';
return $method;
}
}
# |
Change |
User |
Description |
Committed |
|
#1
|
18334 |
Liz Lam |
initial add of jambox |
|
|