Как на PHP написать роутер с ЧПУ?

Написал маршрутизатор для сайта, но меня посещают сомнения в том что я сделал все правильно. Хотелось чтобы он был настолько простым на сколько это возможно, гибким и по возможности без дыр в безопасности.
router.php
$request = explode('/', str_replace(dirname($_SERVER['PHP_SELF'])."/","",$_SERVER['REQUEST_URI']));
$request = array_diff($request, array('')); 
$model=array_shift($request);
if ($model){ 
  function __autoload($class)
  {
    @include ('models/'.$class.'.php');
    if (!class_exists($class, false)) {
	include ('error.php');
	error::num_404($class);
    }
  }
  if (class_exists($model)) { $model::run($request); }
}
else { 
  include ('main.php');
}

Маршрутизатор просто проинклюдирован к index.php, mod_rewrite в свою очередь включен и все переадресует на index.php.
RewriteEngine On
RewriteRule .* index.php [L]

Но глядя на него меня посещают следующие вопросы:
1. Возможно маршрутизатор должен быть классом или с таким функционалом можно использовать как есть?
2. Стоит ли использовать __autoload в маршрутизаторе?
3. Да и вообще что я делаю не так?

З.Ы.: Заранее благодарен за конструктивную критику и советы по улучшению.
  • Вопрос задан
  • 9971 просмотр
Решения вопроса 2
@frantic
В таком виде у вас самый простейший вариант распределения. Главным недостатком такого подхода является жесткая связь между uri и названием классов и методов. Порой это очень не удобно.

Лучше используйте внешние библиотеки. Вместе с composer.
Роутеров сейчас навалом, например, Pux.
Или напишите свой.
Ответ написан
Комментировать
Anonym
@Anonym
Программирую немного )
1. Вместо __autoload лучше использовать spl_autoload_register.
2. Проверять class_exists в маршрутизаторе не нужно, этим пусть занимается автозагрузчик.
3. А вот method_exists стоит проверить.

Ну и приведу кусок роутера из своего старого проекта (код не претендует на идеальность, но мне нравится):
Кусок кода
public static function launch() {
    if ($controller = self::getParam('controller')) {
      self::$controller = $controller;
    }
    if ($action = self::getParam('action')) {
      self::$action = $action;
    }

    $controllerName = strtolower(self::$controller).'Controller';
    $controllerAction = 'execute'.ucfirst(strtolower(self::$action));
    $controller = new $controllerName();
    if (!method_exists($controller, $controllerAction)) {
      throw new NotFoundException('Method \''.$controllerName.'::'.$controllerAction.'\' not found');
    }
    $controller->$controllerAction();
  }

  public static function getParam($param_name, $type = 'string') {
    if (isset($_GET[$param_name])) {
      if (!isset(self::$params[$param_name])) {
        self::$params[$param_name] = self::clean($_GET[$param_name], $type);
      }
      return self::$params[$param_name];
    }
    return NULL;
  }

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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