Маршрутизация, имеет ли такой подход право быть?

В попытках реализовать первый проект на mvc паттерне столкнулся с проблемой роутинга. В итоге проблему нужно было решать, немного погуглив, поспрашивав там и тут, додумал такое вот решение:
<?php
namespace lib;
class Router {
    private $rulls;
	private $uri;
	private $controller;
	private $params = [];
 
    function __construct(){
		$this->setUri();
		$this->setController();
		$this->setParams();
		$this->setRulls();
    }

    private function setURI(){
    	if($_SERVER['REQUEST_URI'] != '/'):
    		$this->uri = explode('/',trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'));
        endif;
    }
   
   private function setController(){
	   $this->controller = array_shift($this->uri);
   }
   
   private function setParams(){
	   foreach ($this->uri as $value):
          $this->params[] = $value;
       	endforeach;
   }
   
   private function setRulls(){
	  file_exists(SITE_ROOT.DS.'routing'.DS.'rulls.php') ? $this->rulls = include(SITE_ROOT.DS.'routing'.DS.'rulls.php') : die('Файл с конфигурацией роутинга где-то затерялся, извини.');
   }
   
   	public function run(){
		$_REQUEST = array_merge($_REQUEST, $this->params);
		$controller = '\\controllers\\'.$this->rulls[$this->controller]['controller'];
		$action = $this->rulls[$this->controller]['action'];
		$controller = new $controller;
		$controller->$action();
	}
}
?>

Все вроде как работает, но мб есть более очевидное решение или это не соответствует сегодняшним реалиям в данном вопросе. Хотелось бы услышать объективную критику, и если есть куда копать(а я просто убежден в том, что есть), мб подскажите?
  • Вопрос задан
  • 541 просмотр
Пригласить эксперта
Ответы на вопрос 4
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Use HttpFoundation Luke!
2. Ваш роутер, был бы не плох лет эдак 10 назад, но не сейчас, посмотрите роутинг symfony, или silex
3. ОБЯЗАТЕЛЬНО читаем: PSR-1, PSR-2, PSR-4

<?php
namespace lib;
class Router {
// Может rules все таки?))
      private $rulls; // Зачем тут отступ?
// phpDocumentor - ваш друг, прописывайте ОБЯЗАТЕЛЬНО типы данных.
    private $uri;
    private $controller;
    private $params = [];

    function __construct(){
        $this->setUri(); // У вас нет такого метода, есть setURI
        $this->setController();
        $this->setParams();
        $this->setRulls();
    }
// Что будет, если $_SERVER['REQUEST_URI'] = '/?', или '/////'?
    private function setURI(){
// Подобное форматирование может и ок для шаблонов, и то где-то, где вообще незаметно, но не тут читаем про PSR-2
        if($_SERVER['REQUEST_URI'] != '/'):
            $this->uri = explode('/',trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'));
        endif;
    }
// Я правильно понимаю, вы хотите сказать, что контроллер - это некий элемент массива (похоже string|null)? Обычно контроллер - это объект...
    private function setController(){
        $this->controller = array_shift($this->uri);
    }
// В этом методе вы по тупому копируете элементы, зачем?
    private function setParams(){
// Подобное форматирование может и ок для шаблонов, и то где-то, где вообще незаметно, но не тут читаем про PSR-2
        foreach ($this->uri as $value):
            $this->params[] = $value;
        endforeach;
    }

    private function setRulls(){
// NO! загрузка данных - это НЕ задача роутера, от слова СОВСЕМ
        file_exists(SITE_ROOT.DS.'routing'.DS.'rulls.php') ? $this->rulls = include(SITE_ROOT.DS.'routing'.DS.'rulls.php') : die('Файл с конфигурацией роутинга где-то затерялся, извини.');
    }
// В методе ничего нечего спасать, просто удалите его.
    public function run(){
// НЕ ИСПОЛЬЗУЙТЕ ГЛОБАЛЬНЫЕ ПЕРМЕННЫЕ
        $_REQUEST = array_merge($_REQUEST, $this->params);
        $controller = '\\controllers\\'.$this->rulls[$this->controller]['controller'];
        $action = $this->rulls[$this->controller]['action'];
        $controller = new $controller; // Что будет, если такого класса нет?
        $controller->$action(); // Что будет, если такого метода нет?
    }
}
Ответ написан
Комментировать
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
> есть более очевидное решение
> это не соответствует сегодняшним реалиям в данном вопросе

Это полезно лишь только для вашего развития.
Ответ написан
delef
@delef
Разработчик (Crystal, Python, Ruby, PHP, JS)
Имеет место быть, почему нет?
Ответ написан
Комментировать
trevoga_su
@trevoga_su
Комментировать
Ваш ответ на вопрос

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

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