Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class Router {
- public $routes = array();
- private $types = [
- 'number' => '(\d+)',
- 'text' => '([a-zA-Z]+)',
- 'mixed' => '(\w+)'
- ];
- public function __construct(array $routes = []) {
- $this->register($routes);
- }
- private function routeToRegExp($path) {
- $arrPath = explode('/', $path);
- $params = array( 'originalPath' );
- $arrExp = array();
- foreach ($arrPath as $segment) {
- if (strpos($segment, ':') === false) {
- $arrExp[] = $segment;
- } else {
- $expression = explode(':', $segment);
- $paramName = $expression[0];
- $params[] = $paramName;
- $arrExp[] = isset($this->types[$expression[1]]) ? $this->types[$expression[1]] : $this->types['mixed'];
- }
- }
- if($arrExp[count($arrExp) -1] == '') {
- unset($arrExp[count($arrExp) -1]);
- }
- $regString = '/' . implode('\/', $arrExp).'.*/';
- return array(
- 'reg' => $regString,
- 'params' => $params
- );
- }
- private function register($routes) {
- foreach ($routes as $path => $fn) {
- $pathReg = $this->routeToRegExp($path);
- $this->routes[$pathReg['reg']] = array(
- 'fn' => $fn,
- 'params' => $pathReg['params']
- );
- }
- }
- private function mapParams($params, $result) {
- $map = array();
- foreach($result as $key => $value) {
- $map[$params[$key]] = $value;
- }
- return $map;
- }
- public function route(array $path) {
- $selectedFn = null;
- $url = $this->normalizePath($path);
- foreach ($this->routes as $reg => $data) {
- $isMatch = preg_match($reg, $url, $match);
- if ($isMatch) {
- $selectedFn = $data['fn'];
- break;
- }
- }
- if($selectedFn == null) {
- return false;
- }
- return $selectedFn($this->mapParams($data['params'],$match));
- }
- public function add($path, $fn) {
- $pathReg = $this->routeToRegExp($path);
- $this->routes[$pathReg['reg']] = array(
- 'fn' => $fn,
- 'params' => $pathReg['params']
- );
- }
- private function normalizePath(array $path): string {
- $url = array();
- foreach($path as $key => $item) {
- if(is_numeric($key)) {
- $url[$key] = $item;
- }
- }
- return '/'.implode('/', $url);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment