@@ -11,39 +11,49 @@ class Router implements RouterInterface {
private array $rules = [];
private string $startPoint = " / " ;
/**
* @param string $startPoint
*/
public function setStartPoint ( string $startPoint ) : void {
$this -> startPoint = $startPoint ;
/** @inheritDoc */
public function setStartPoint ( string $mountPoint ) : void {
$this -> startPoint = $mountPoint ;
}
/**
* @param array $rules
*/
/** @inheritDoc */
public function withRules ( array $rules ) : void
{
$this -> rules = [];
foreach ( $rules as $rulesKey => $rulesNode ) {
// проверка формата
if ( ! isset ( $rulesNode [ 'key' ], $rulesNode [ 'routes' ])) continue ;
// преобразуем псевдомаску в реальную маску
// заменяем алиасы на регвыражения
$realPattern = preg_replace ( " '<([A-z0-9]+?):@any>' " , " (?P< $ 1>.*) " , $rulesNode [ 'key' ]) ;
$realPattern = preg_replace ( " '<([A-z0-9]+?):@num >' " , " (?P< $ 1>[0-9]+ ) " , $realPattern );
$realPattern = preg_replace ( " '<([A-z0-9]+?):@path >' " , " (?P< $ 1>[^/ ]+) " , $realPattern );
$realPattern = $rulesNode [ 'key' ];
$realPattern = preg_replace ( " '<([A-z0-9_ ]+?):@any >' " , " (?P< $ 1>.* ) " , $realPattern );
$realPattern = preg_replace ( " '<([A-z0-9_ ]+?):@num >' " , " (?P< $ 1>[0-9 ]+) " , $realPattern );
$realPattern = preg_replace ( " '<([A-z0-9_]+?):@path>' " , " (?P< $ 1>[^/]+) " , $realPattern );
// поддерживаем свободное регулярное выражение в псевдомаске
$realPattern = preg_replace ( " '<([A-z0-9]+?):(.+?)>' " , " (?P< $ 1> $ 2) " , $realPattern );
$realPattern = preg_replace ( " '<([A-z0-9_ ]+?):(.+?)>' " , " (?P< $ 1> $ 2) " , $realPattern );
// заменяем алиасы на регвыражения
$realPattern = str_replace ([ " <@any> " , " <@num> " , " <@path> " ], [ " .* " , " [0-9]+ " , " [^/]+ " ], $realPattern );
// при наличии слеша в конце правила url должно строго ему соответствовать
$end = ( preg_match ( " '/ $ ' " , $realPattern )) ? " $ " : " " ;
$end = ( str_ends_with ( $realPattern , " / " )) ? " $ " : " " ;
// меняем запись на паттерн
$this -> rules [ $rulesKey ] = $rulesNode ;
$this -> rules [ $rulesKey ][ 'key' ] = " '^ " . $realPattern . $end . " ' " ;
}
}
/** @inheritDoc */
public function withSet ( array $rules ) : void
{
$this -> rules = [];
foreach ( $rules as $rulesKey => $rulesNode ) {
if ( ! isset ( $rulesNode [ 'key' ], $rulesNode [ 'routes' ])) continue ;
$rulesNode [ 'key' ] = trim ( $rulesNode [ 'key' ], '/' );
if ( ! preg_match ( " '^[A-z0-9_/]+ $ ' " , $rulesNode [ 'key' ])) continue ;
$this -> rules [ $rulesKey ] = $rulesNode ;
}
}
/** @inheritDoc */
public function match ( RequestInterface $request ) : ? array {
foreach ( $this -> rules as $rule ) {
@@ -96,4 +106,31 @@ class Router implements RouterInterface {
}
return null ;
}
}
/** @inheritDoc */
public function matchByArgv ( RequestInterface $request ) : ? array {
foreach ( $this -> rules as $rule ) {
// вычисляем строку для поиска
$currentString = trim ( preg_replace ( " '^ " . preg_quote ( $this -> startPoint ) . " /' " , " " , $request -> getServerParams ()[ 'argv' ][ 1 ]), '/' );
// в цикле проверяем совпадения текущей строки с правилами
if ( $rule [ 'key' ] == $currentString ) {
$routes = [];
foreach ( $rule [ 'routes' ] as $route ) {
$className = ( ! empty ( $route [ 'action' ])) ? $route [ 'action' ] : " " ;
$methodName = ( ! empty ( $route [ 'method' ])) ? $route [ 'method' ] : " " ;
$params = [];
foreach ( $request -> getServerParams ()[ 'argv' ] as $key => $param ){
if ( $key < 2 ) continue ;
$params [ $key ] = ( preg_match ( " '^[0-9]+ $ ' " , $param )) ? ( int ) $param : $param ;
}
$routes [] = new MatchObject ( $className , $methodName , $params );
}
return $routes ;
}
}
return null ;
}
}