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; } }