Пишем маршрутизацию с помощью регулярок - часть 2

Теперь напишем диспетчер ядра, который будет создавать объект нужного контроллера и выполнять запрос, подставляя переменные

Разбор регулярных выражений снижает производительность. Если вам не нужна сложная обработка адресной строки, то лучше использовать обычные строковые операции. Проверка строк на равенство в операторах типа if или switch..case будет быстрее regex. Также не следует забывать, переадресацию можно задать с помощью сопоставления с образцом на уровне веб-сервера, т.е. файла .htaccess для Apache, если требуется сделать ЧПУ. В этом случае делегировать роутинг можно не диспетчеру маршрутизации в ядре, а дать объектам класса приложения самим решать, какие контроллеры вызывать. Это может дать дополнительную гибкость, если действие меняется в зависимости от какой-то логики.
  Собственно, дополним код из части 1
class page {
	function view($page){
		echo  'Hello from Page\View page = ' . $page;
	}
}

class kernel {
	public $R;
	function __construct($default){
		$this->R = new RouteDispatcher($default);
		  
	}
	
	function define_routes($declarations){
		foreach ($declarations as $classname => $pattern){
			
			$this->R->add($classname, $pattern);
		}
	}
	function dispatch($path){
		$w = $this->R->check($path);
		 
	    $c = $w['matches']['controller'];
	    $m = $w['matches']['action'];
	    $p = $w['matches'];
		
		$obj = new $c();
		$obj->$m(extract($p));
	}
}

 $k = new Kernel('nowhere');
  
 $k->define_routes(
 	  [
 	  
 'test' => "#^(?<controller>test)/(?<action>\w+)$#i",
 "site" => "#^(?<controller>site)/(?<action>\w+)$#i",
 "super" => "#^(?<controller>super)/(?<action>\w+)$#i",
 "view" => "#^(?<controller>page)/(?<action>\w+)/(?<page>\d+)$#i"
 	]);
 $path = 'page/view/100';
 $k->dispatch($path);
В данном случае у нас добавляется Kernel (ядро), единственная задача которого поднять нужный контроллер, вызвать в нем метод и сбагрить туда параметры. Также мы добавили класс page, который должен вывести приветствие и напечатать значение параметра. Проверим, запустив
php test-router.php
как видим, контроллер получил нужные параметры и поприветствовал нас  

Теги документа