Реализация beforeRoute
Доброго времени.
Задался задачей написать что-то наподобие 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');
}
}
}
Источник: Stack Overflow на русском