/**
* Handles a MVC request
*
* @param string $uri
*
* @return \ManaPHP\Http\ResponseInterface
* @throws \ManaPHP\Mvc\Application\Exception
* @throws \ManaPHP\Event\Exception
* @throws \ManaPHP\Mvc\Application\NotFoundModuleException
* @throws \ManaPHP\Mvc\Dispatcher\Exception
* @throws \ManaPHP\Mvc\Dispatcher\NotFoundControllerException
* @throws \ManaPHP\Mvc\Dispatcher\NotFoundActionException
* @throws \ManaPHP\Mvc\View\Exception
* @throws \ManaPHP\Renderer\Exception
* @throws \ManaPHP\Alias\Exception
* @throws \ManaPHP\Mvc\Router\Exception
* @throws \ManaPHP\Mvc\Router\NotFoundRouteException
*/
public function handle($uri = null)
{
if ($this->fireEvent('application:boot') === false) {
return $this->response;
}
$this->router->handle($uri, null, false);
$moduleName = ucfirst($this->router->getModuleName());
$controllerName = $this->router->getControllerName();
$actionName = $this->router->getActionName();
$params = $this->router->getParams();
$this->alias->set('@views', "@app/{$moduleName}/Views");
$this->alias->set('@messages', "@app/{$moduleName}/Messages");
$this->alias->set('@ns.module', '@ns.app\\' . $moduleName);
$this->alias->set('@ns.controllers', '@ns.module\\Controllers');
$this->alias->set('@ns.widgets', '@ns.module\\Widgets');
$moduleClassName = $this->alias->resolve('@ns.module\\Module');
$eventData = ['module' => $moduleName];
$this->fireEvent('application:beforeStartModule', $eventData);
$this->_moduleObject = $this->_dependencyInjector->getShared($moduleClassName);
$this->_moduleObject->registerServices($this->_dependencyInjector);
$eventData = ['module' => $moduleName];
$this->fireEvent('application:afterStartModule', $eventData);
$handler = [$this, '_eventHandlerBeforeExecuteRoute'];
$this->dispatcher->attachEvent('dispatcher:beforeExecuteRoute', $handler);
$ret = $this->dispatcher->dispatch($moduleName, $controllerName, $actionName, $params);
if ($ret === false) {
return $this->response;
}
$actionReturnValue = $this->dispatcher->getReturnedValue();
if ($actionReturnValue === null || is_string($actionReturnValue)) {
$this->view->setContent($actionReturnValue);
$this->view->render($this->dispatcher->getControllerName(), $this->dispatcher->getActionName());
$this->response->setContent($this->view->getContent());
}
return $this->response;
}