| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | <?php/** * * Cube Framework $Id$ zznEwS8sxzhx2PxPdsSqmI4X5Xjp/A8j9rC4HaQ8ZeU= * * @link        http://codecu.be/framework * @copyright   Copyright (c) 2015 CodeCube SRL * @license     http://codecu.be/framework/license Commercial License * * @version     1.4 *//** * dispatcher class */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';    /**     * extended suffix     */    const EXTENDED_SUFFIX = 'Extended';    /**     *     * response object     *     * @var \Cube\Controller\Response\ResponseInterface     */    protected $_response;    /**     *     * view object     *     * @var \Cube\View     */    protected $_view;    /**     *     * get the view object     *     * @return \Cube\View     */    public function getView()    {        if ($this->_view === null) {            $this->setView();        }        return $this->_view;    }    /**     * set the view object     *     * @param \Cube\View $view     *     * @return \Cube\Controller\Dispatcher     */    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;    }    /**     *     * dispatch method     *     * the method will try to run the action method called from the request, and based on the data returned, output the necessary data     * - if the output is an instance of the View class, then the view application resource is ignored even if instantiated     * - if the output is an array, we will inject the array in the view resource if it was created or we create a new view object and inject the data     *     * @param \Cube\Controller\Request\AbstractRequest    $request     * @param \Cube\Controller\Response\ResponseInterface $response     * @param bool                                        $partial set to true if a we have an action helper.     *     * @throws \Cube\Exception\Dispatcher     * @return \Cube\Controller\Response\ResponseInterface $response     */    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;        // try loading an extended controller first        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)) {                // we catch any output given directly from the action method                 // and display it after outputting the view file                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) {                        // for the action view helper, this will overwrite any action variables with the newer ones                        $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;    }}
 |