@atambalasi

Как регистрировать роуты?

Целях практики реализую роутинг. Не могу решить одну проблему.
Есть файл в нем регистрируюется роуты
use Core\Http\RouteRegister;

Route::get('/ma', 'Controller@bigTester');
Route::get('/admin/add/video/google/high/:cat_id/:video_id/:auth', 'Controller@test');

Вот класс Route
namespace Core\Http;

use Core\Http\RouteRegister;

class Route
{
	public $url;
	public $route;
	private $generedRoute;
	private $className;
	private $action;
	private $paramsCount;
	private $paramsCountRoute;
	private $slashCount;
	private $slashCountUrl;
	private $params = null;
	
	public static function initRoute($route, $classAction)
	{
		$init = new Route();
		$init->route = $route;
		//$init->className = $classAction;
		$init->url = $init->getURL();
		$init->slashCount = $init->getParamsAndSlashesCount('slash');
		$init->slashCountUrl = $init->getParamsAndSlashesCount('slash_url');
		$init->paramsCount = $init->getParamsAndSlashesCount();
		$init->generedRoute = $init->getGeneredUrl();
		$init->params = $init->getParams();
		$init->paramsCountRoute = $init->getParamsNameFromRoute(true);
		
		/*$regiter = new RouteRegister();
		$register->url = $init->url;
		$regiter->route = $init->route;
		$regiter->classAction = $classAction;*/
		return $init;
	}
	public static function get($route, $classAction)
	{
		$init = self::initRoute($route, $classAction);
		if(($init->slashCount + 1) == $init->slashCountUrl)
		{
			$init->slashCountUrl = $init->slashCountUrl - 1;
		}elseif(($init->slashCount - 1) == $init->slashCountUrl)
		{
			$init->slashCountUrl = $init->slashCountUrl + 1;
		}
		echo $init->url . "<br>";
		echo $init->generedRoute;
		
		if( $init->url == $init->generedRoute /*&& $init->slashCount == $init->slashCountUrl*/)
		{
			 $tempArray = explode("@", $classAction);
			 $className = $tempArray[0];
			 $action = $tempArray[1];
			 $cls =   'Controllers\\' . $className ;
			 $obj = new $cls;
			//if(count($init->params))
			//{
				$obj->$action($init->params);
			//}else
			//{
				//$obj->$action();
				
			//}
		}else
		{
			//echo "The route as " . $init->url;
			echo "<h1> NOT FOUND </h1>";
		}
		/*for($i=0; $i < count($paramsArray); $i++)
		{
			if($i == 0)
			{
				$params[$paramsArray[$i]] = $paramsArray[$i + 1];
			}elseif($i%2 == 0)
			{
				$params[$paramsArray[$i]] = $paramsArray[$i + 1];
			}		
		}*/
		//exit();
	}
	public function getParams()
	{
		
		$paramsArray = $this->getParamsArray();
		$paramsCount = $this->getParamsAndSlashesCount();
		$keyName 	 = $this->getParamsNameFromRoute();
		$params 	 = [];

		for($i=0; $i < $this->paramsCount; $i++)
		{
			if(!isset($paramsArray[$i]) || empty($paramsArray[$i])) 
			{		
				echo "<h3 style='color:red'> You lost param!! Created route " . $this->route . "<h3>";
				echo "<h3 style='color:red'> Your url: " . $this->url . "<h3>";
				exit();
			}
			$params[$keyName[0][$i]] = $paramsArray[$i];
		}
		return $params;
	}
	public function getGeneredUrl()
	{
		$url = $this->getURL();
		$paramsArray = $this->getParamsArray();
		$countSlashes = $this->getParamsAndSlashesCount('slash');
		$paramsCount = $this->getParamsAndSlashesCount();
		if($paramsCount == 0)
		{
			return $url;
		}else
		{
			$routeArray = explode('/', $this->route);
			$generedURLArray = array_slice($routeArray, 0, ($countSlashes - $this->paramsCount) + 1);
			array_push($generedURLArray, implode('/', $paramsArray));
		
			return  implode('/', $generedURLArray);
		}
		

	
	}
	public function getParamsArray()
	{
		$countSlashes = $this->getParamsAndSlashesCount('slash');
		$paramsCount = $this->getParamsAndSlashesCount();
		$urlArray = explode('/', $this->url);
		$paramsArray = array_slice($urlArray, ($countSlashes - $this->paramsCount) + 1);
		//echo count($paramsArray);
		return $paramsArray;
		
		
	}
	public function getURL()
	{
		return $_SERVER['REQUEST_URI'];
	}
	public function getParamsAndSlashesCount($which = 'params')
	{
		if($which == 'params')
		{
			return preg_match_all("/(:)\w+/", $this->route, $out);
		}elseif($which == 'slash')
		{
			return 	preg_match_all("/\//", $this->route);
		}elseif($which == 'slash_url')
		{
			return 	preg_match_all("/\//", $this->url);
		}
	
	}
	public function getParamsNameFromRoute($count = false)
	{
		if(!$count)
		{
			preg_match_all("/(:)\w+/", $this->route, $out);
			return $out;
		}elseif($count)
		{
			return preg_match_all("/(:)\w+/", $this->route);
		}
	}
}


Вот индекс файл. Тут подключаю файл routes.php
require_once '../core/autoload.php';
require_once '../core/routes.php';

use Models\Users;
use Controllers\Controller;
use Core\Http\RouteRegister;

Класс-маршрутизатор определеяет запрашиваемой страницы.
> цепляет классы контроллеров
> создает экземпляры контролеров страниц и вызывает действия этих контроллеров.
Но он вызвает все роуты из файла routes.php. Он так и должен делать. Т.к. подключаю файл routes.php в index.php и просходить вызов метода гет столько сколько роутов определено в файле. А как регистрировать роуты чтобы только вызвался тот роут котрый мне нужен. Т е например набираю в адресе
site.loc/ma
сейчас вызвает bigTester и test акшыны.
мне нужен чтобы вызов был только bigTester.
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы