Я новичок в 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();
?>