Это хороший способ сопоставить URI с классом / методом в PHP для MVC

Я новичок в MVC, так что это моя первая попытка, и я уверен, что вы, ребята, можете улучшить меня, спасибо за любые советы или help!

Ниже приводится то, что я придумал для системы маршрутизатора / диспетчера для моей личной инфраструктуры, над которой я работаю, это моя первая попытка использовать шаблон MVC.

Первый блок кода - это просто мой Файл .htaccess, который направляет все запросы через мой файл index.php.

Второй блок кода - это мой массив «Маршрутов», который сообщает объекту «Маршрутизатор», какой класс и метод вызывать, а также любые идентификаторы или номера страниц, если они существуют.

Третий блок кода - это маршрутизатор. class.

Четвертый блок просто запускает класс

Таким образом, класс маршрутизатора должен использовать регулярное выражение для сопоставления URI с маршрутом в карте маршрутов, теоретически это звучит как плохая производительность, когда есть список Более 50 маршрутов, на которых должно выполняться регулярное выражение, должен ли я делать это по-другому? Основная причина, по которой я использую регулярное выражение, - это сопоставление номеров страниц и идентификационных номеров, когда они существуют в маршруте.

Также, пожалуйста, не просто говорите мне использовать фреймворк, я делаю это, чтобы лучше изучить его, я лучше узнаю это и просто предпочитаю не использовать существующую структуру в настоящее время, у меня уже есть исследования всех основных и некоторых менее распространенных идей.

1) Итак, главный вопрос, что-то просто не выглядит правильным?

2) Есть ли лучший способ определить, что находится в URI, чем использование регулярного выражения в массиве, как это делаю я, рассмотрите его на сайте с высоким трафиком?

3) Поскольку все маршрутизируется через файл index.php с это, как я могу обрабатывать запросы AJAX?

Извините, если это сбивает с толку, я немного запутался, mtyself!


.htaccess файл

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$   index.php?uri=$1    [NC,L,QSA]

Map array ()

/**
 * Map URI to class/method and ID and Page numbers
 * Must be an array
 */
$uri_route_map = array( 
    //forums
    'forums/' => array(
        'controller' => 'forums',
        'method' => 'index',
        'id_number' => '',
        'page_number' => ''),

    'forums/viewforum/(?<id_number>\d+)' =>  array(
        'controller' => 'forums',
        'method' => 'viewforum',
        'id_number' => isset($id_number),
        'page_number' => ''),  

    'forums/viewthread/(?<id_number>\d+)' =>  array(
        'controller' => 'forums',
        'method' => 'viewthread',
        'id_number' => isset($id_number),
        'page_number' => ''),

    'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' =>  array(
        'controller' => 'forums',
        'method' => 'viewthread',
        'id_number' => isset($id_number),
        'page_number' => isset($page_number)),

    // user routes
    // account routes
    // blog routes 
    // mail routes
    // various other routes
);

Класс маршрутизатора, который читает и сопоставляет массив Map выше

/**
 * Run URI against our Map array to get class/method/id-page numbers
 */
 class Router
{
    private $_controller = '';
    private $_method = '';
    public $page_number = '';
    public $id_number = '';

    public function __construct($uri, array $uri_route_map)
    {
        foreach ($uri_route_map as $rUri => $rRoute)
        {
            if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits))
            {
                //if page number and ID number in uri then set it locally
                $this->page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null);
                $this->id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null);
                $this->_controller = $rRoute['controller'];
                $this->_method = $rRoute['method'];

                // just for debug and testing while working on it / will be removed from final code
                echo '<hr> $page_number = ' . $this->page_number . '<br><br>';
                echo '<hr> $id_number = ' . $this->id_number . '<br><br>';
                echo '<hr> $controller = ' . $this->_controller . '<br><br>';
                echo '<hr> $method = ' . $this->_method . '<br><br>';
                break;
            }else{
                $this->page_number = '';
                $this->id_number = '';
                $this->_controller = '404';
                $this->_method = '404';
            }
        }
    }

    public function getController()
    {
        return $this->_controller;
    }

    public function getMethod()
    {
        return $this->_method;
    }

    public function getPageNumber()
    {
        return $this->page_number;
    }

    public function getIDNumber()
    {
        return $this->id_number;
    }

    /**
     * Call our class and method from values in the URI
     */
    public function dispatch()
    {
        if (file_exists('controller' . $this->_controller . '.php'))
        {
            include ('controller' . $this->_controller . '.php');
            $controllerName = 'Controller' . $this->_controller;
            $controller = new $controllerName($this->getIDNumber(),$this->getPageNumber());
            $method = $this->_method;
            if (method_exists($this->_controller, $this->_method))
            {
                return $controller->$method();
            } else {
                // method does not exist
            }
        } else {
            // Controller does not exist
        }
    }

}

Run it

/**
 * Testing the class
 */
$uri = isset($_GET['uri']) ? $_GET['uri'] : null;
$router = new Router($uri, $uri_route_map);
$router->dispatch();

?>
6
задан stslavik 22 August 2011 в 17:33
поделиться