Реализация beforeRoute

Рейтинг: 1Ответов: 0Опубликовано: 02.12.2014

Доброго времени.

Задался задачей написать что-то наподобие beforeRoute.

Есть класс роута, в индекс файле инициализирую роуты:

Registry::App()->routes=['index'=>'index/index','main'=>'main/index'];

Фронт контроллер берёт роуты и формирует контроллер => экшен:

// парсим роуты
    $Router->parserUrl(Registry::App()->routes);

// контроллер из роута
    Registry::App()->contr->setController($Router->Controller());

// экшен из роута
    Registry::App()->contr->setAction($Router->Action());

// запуск контроллера и экшена по URL
    Registry::App()->contr->run();

Вопрос: как можно из контроллера в конструкторе или каким-то методом переопределить роуты или добавить в роут ['main/test'=>'main/test'], так чтоб при переходе на main/test вызывался экшен тест.

Пробовал события - не выходит. (

Сами классы:

class Route extends Libs {

    private $url;
    private $segments;
    private $_controller;
    private $_action;
    private $_parameters;
    private  static $_routes;

    function __construct(){
        $real_url = substr($_SERVER['SCRIPT_NAME'], 0, -9);
        $url = substr($_SERVER['REQUEST_URI'], strlen($real_url));
        $out = trim($url, '/');
        $this->url=filter_var($out, FILTER_SANITIZE_URL);
    }

    function parserUrl($route=[]){
        foreach ($route as $rUri => $rRoute) {
            $pattern = '`^' . $rUri . '$`ui';
            if (preg_match_all($pattern, $this->url)) {
                $this->segments = preg_replace($pattern, $rRoute, $this->url);
                break;
            }
        }
      $this->parserSegments();
    }

    function parserSegments(){
        $this->segments = explode('/', trim($this->segments, '/'));
        $this->_controller = array_shift($this->segments);
        $this->_action =array_shift($this->segments);
        $this->_parameters= $this->segments;
    }

    static function getRoutes(){
        return self::$_routes;
    }

    function Controller(){
        return $this->_controller;
    }

    function Action(){
        return $this->_action;
    }

    function parameters(){
        return $this->_parameters;
    }

}

class FrontController{

    protected $controller;
    protected $action;

    function setController($controller){
        $this->controller=ucfirst($controller).'Controller';
    }

    function setAction($action){
        $this->action='action'.ucfirst($action);
    }

    function getController(){
        $pathController='controllers/'.$this->controller.'.php';
        if(file_exists($pathController)){
            include_once $pathController;
        }else{
            throw new Exception('Controller '.$this->controller.' not found');
        }
        return $this->controller;
    }

    function getAction(){
        return $this->action;
    }

    function run(){
        $ref=new ReflectionClass($this->getController());
        if($ref->hasMethod($this->getAction())){
            $instance=$ref->newInstance();
            $action=$ref->getMethod($this->getAction())->invoke($instance);
        }else{
            throw new Exception('Action '.$this->getAction().' not found');
        }
    }

}

Ответы

Ответов пока нет.