Как сделать проверку на наличие метода в контроллере в моем примере?

Есть роутер
class Router{

	function __construct(){
		if($_SERVER['REQUEST_URI'] != '/'){
			$URL = trim($_SERVER['REQUEST_URI'], '/');//чистим от "/"
		}else{
			$URL = DEFAULT_MODULE;//модуль по умолчанию
		}
		$partsURL = explode('/', $URL);//делаем массив из пришедшего URL
		
		$Controller = array_shift($partsURL);//вырезаем имя модуля из массива
		
		if(count($partsURL) % 2 == 0 && file_exists(PATH_CONTROLLER_FILE.$Controller.'.controller.php')){//проверяем существование контроллера
			$arraySize = count($partsURL);//узнаем размер массива
			if($arraySize != 0){//оформляем параметры
				for ($i=0; $i < $arraySize; $i++){//оформляем параметры id/123 под вид ['id'] => ['123']
				$Params[$partsURL[$i]] = $partsURL[++$i];
				}   
			}else $Params = false;
		}else{
			$Controller = 'error404';
			$Params = false;
		}
		$fileName = 'controller_'.$Controller;//определяем название класса для функции __load()
		$startController = new $fileName($Params);//запускаем контроллер
	}	
}

Изначально делал под URL вида /controller/param/123/param2/123 и т.д.
Но дальше понял, что нужно в нем указать еще action...типо /controller/action/param/123/param2/123

Вопрос в том, как это правильно написать? т.е. логику не могу вкурить...
Может кто-то что-то подсказать?
  • Вопрос задан
  • 2485 просмотров
Решения вопроса 1
@vdem
$Controller = array_shift($partsURL);//вырезаем имя модуля из массива

Дальше добавить:
$Action = array_shift($partsURL);//вырезаем имя действия из массива

UPD: Потом после
$startController = new $fileName($Params);//запускаем контроллер

Сделать
$startController->$Action($Params);//запускаем действие
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Регулярные выражения. Делайте раутинг на регулярках, будет проще и няшнее. И не пишите логики в конструкторе. Логика должна быть в методах, в конструкторе только тупое присваивание и инициализация значений.

Узнать существует ли нужный класс, или метод класса уже детали. Вы можете через рефлексии получить аргументы метода-экшена и вызывать этот экшен с привязкой значений из URI.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы