A
A
alestro2015-10-15 17:19:32
PHP
alestro, 2015-10-15 17:19:32

Routing, does such an approach have the right to be?

In an attempt to implement the first project on the mvc pattern, I ran into a routing problem. As a result, the problem had to be solved, after a little googling, asking around here and there, I came up with this solution:

<?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();
  }
}
?>

Everything seems to be working, but maybe there is a more obvious solution or it does not correspond to today's realities in this matter. I would like to hear objective criticism, and if there is where to dig (and I'm just convinced that there is), mb tell me?

Answer the question

In order to leave comments, you need to log in

4 answer(s)
I
index0h, 2015-10-15
@index0h

1. Use HttpFoundation Luke!
2. Your router would not be bad about 10 years ago, but not now, look at symfony routing , or silex
3. ALWAYS read: 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(); // Что будет, если такого метода нет?
    }
}

V
Vitaly Khomenko, 2015-10-15
@iiifx

> there is a more obvious solution
> this does not correspond to today's realities in this matter
. This is only useful for your development.

I
Ivan Palamarchuk, 2015-10-15
@delef

It does exist, why not?

T
trevoga_su, 2015-10-16
@trevoga_su

www.phpinfo.su/articles/practice/chpu_na_php.html

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question