123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- <?php
- namespace Cube\Controller;
- use Cube\Controller\Request\AbstractRequest,
- Cube\Controller\Response\ResponseInterface,
- Cube\Exception\Dispatcher as DispatcherException,
- Cube\View;
- class Dispatcher implements Dispatcher\DispatcherInterface
- {
- const DIR_SEPARATOR = '/';
- const DIR_CONTROLLERS = 'Controller';
-
- const EXTENDED_SUFFIX = 'Extended';
-
- protected $_response;
-
- protected $_view;
-
- public function getView()
- {
- if ($this->_view === null) {
- $this->setView();
- }
- return $this->_view;
- }
-
- public function setView(View $view = null)
- {
- if (!$view instanceof View) {
- $bootstrap = Front::getInstance()->getBootstrap();
- if ($bootstrap->hasResource('view')) {
- $view = $bootstrap->getResource('view');
- }
- else {
- $view = new View();
- }
- }
- $this->_view = $view;
- return $this;
- }
-
- public function dispatch(AbstractRequest $request, ResponseInterface $response, $partial = false)
- {
- $output = null;
- $moduleName = $request->getModule();
- $controllerName = $request->getController();
- $actionName = $request->getAction();
- $className = $moduleName . '\\' . self::DIR_CONTROLLERS . '\\' . $controllerName;
-
- if (class_exists($className . self::EXTENDED_SUFFIX)) {
- $className .= self::EXTENDED_SUFFIX;
- }
- if (class_exists($className)) {
- $controller = new $className($request, $response);
- if (method_exists($controller, $actionName)) {
-
-
- ob_start();
- $result = $controller->$actionName();
- $actionOutput = ob_get_clean();
- if ($result instanceof View) {
- $output = $result->render();
- }
- else if (is_array($result)) {
- $view = $this->getView();
- if ($view instanceof View) {
-
- $view->setVariables($result);
- }
- $viewFileName = $view->getViewFileName();
- $viewPath = self::DIR_SEPARATOR
- . $request->normalize($moduleName, true) . self::DIR_SEPARATOR
- . $request->normalize($controllerName, true) . self::DIR_SEPARATOR
- . ((!empty($viewFileName)) ?
- $viewFileName : $request->normalize($actionName, true) . View::FILES_EXTENSION);
- $view->setViewFileName(null);
- if ($partial === true) {
- $output = $view->process($viewPath, true);
- }
- else {
- $view->process($viewPath);
- $view->setContent($actionOutput);
- $output = $view->render();
- }
- }
- $response->appendBody($output);
- }
- else {
- $response->setHeader(' ')
- ->setResponseCode(404);
- throw new DispatcherException(sprintf("Module: '%s' - action '%s' for the '%s' controller does not exist",
- $moduleName, $actionName, $className));
- }
- }
- else {
- $response->setHeader(' ')
- ->setResponseCode(404);
- throw new DispatcherException(sprintf("Module: '%s' - controller '%s' does not exist.", $moduleName,
- $className));
- }
- $this->_response = $response;
- return $response;
- }
- }
|