Сначала общий обзор шагов, которые необходимо выполнить (примерно) для обработки HTTP-запросов:
- Разбор каждого запроса через index.php .Файл index.php является точкой входа вашего приложения MVC.
- Считайте путь URI из значения
REQUEST_URI
глобальной переменной $_SERVER
и HTTP-метод из REQUEST_METHOD
. - Сохраните их вместе со значениями других глобальных переменных ($ _POST, $ _GET и т. д.) в объект
Request
(например, экземпляркласса, названного, например, Request
). - Получите роутер типа FastRoute и создайте свой список маршрутов - прочтите документацию, пожалуйста.Каждый маршрут определяется как объект с HTTP-методом , шаблоном и обработчиком (например, метод контроллера, например, action ) в качестве свойств.
- Сравните компоненты запроса ( HTTP-метод и URI-путь из объекта
Request
) с компонентами каждого объекта маршрута ( HTTP-метод и pattern свойства) в списке маршрутов. - Если найдено совпадение, например, если компоненты запроса совпадают с компонентами запросазатем создайте экземпляр контроллера и вызовите его action , например, соответствующий обработчик маршрута .
- Передайте объект
Request
в качестве аргумента, чтобы иметь возможностьчтобы прочитать из него значения POST, GET и т. д. - Контроллер action загружает соответствующий файл шаблона, отображает его содержимое и возвращает его.
- Распечатывает возвращенное значениесодержимое (с
echo [here the content string];
).
Шаг 1:
Давайте теперь скажем, что ваш URL равен http://localhost/get-books
, а метод HTTP - GET
.И что в список маршрутов роутера вы добавили объект маршрута со следующими свойствами:
- HTTP-метод:
GET
, - pattern:
/get-books
, - обработчик маршрута:
book_controller::getAllBooks
.
После обработки всех вышеперечисленных шагов напечатанный контент будет выглядеть примерно так:
index.php:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
<meta charset="UTF-8" />
<!-- The above 3 meta tags must come first in the head -->
<title>Demo</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
$('#printBooksButton').on('click', function () {
$.ajax({
/*
* This value ('/print-books') corresponds to a
* route definition in the predefined routes list.
*/
url: '/print-books',
/*
* This value ('POST') corresponds to the HTTP method
* of a route definition in the predefined routes list.
*/
method: 'POST',
dataType: 'html',
data: {},
success: function (response, textStatus, jqXHR) {
$('#books').html(response);
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Error. Sorry!');
//...
},
complete: function (jqXHR, textStatus) {
//...
}
});
});
});
</script>
</head>
<body>
<form action="" method="post">
<button type="button" id="printBooksButton" name="printBooksButton" value="printBooks">
Print all books
</button>
</form>
<div id="books">
Here comes the books list.
</div>
</body>
</html>
Шаг 2:
В момент нажатия кнопки printBooksButton
, выполняется запрос ajax и анализируется с броском index.php
.Но на этот раз запрос имеет метод HTTP POST
, а URL-адрес http://localhost/print-books
.Исходя из того, что вы уже определили другой маршрут в списке маршрутов со следующими свойствами:
- HTTP-метод:
POST
, - pattern:
/print-books
, - обработчик маршрута:
book_controller::printBooks
,
и что общие шаги в index.php
обработаны, действие printBooks
из book_controller
выполнен.Но возвращенный контент не будет представлять всю структуру веб-страницы.Вместо этого это будет только HTML-код для представления списка книг.Этот HTML-код «принимается» обратным вызовом success
запроса ajax в качестве аргумента response
.Поэтому, наконец, он заполняется в div с идентификатором books
.
<ul class="books-list">
<li>Book 1</li>
<li>Book 2</li>
<li>Book 3</li>
<li>Book 4</li>
</ul>
РЕДАКТИРОВАТЬ 1:
Примечание: В своем ответе я ранее предполагал, что вы реализуете приложение MVC.Позже, после того, как ваш вопрос отредактирован, я понял, что это может быть не на 100%.Но было слишком поздно (относительно позднего часа), чтобы я что-то изменил.Итак, ответьте мне на вопрос: все ли HTTP-запросы к вашему приложению перенаправлены только на одну страницу, например, на index.php
?Я буду ждать ответа, и пока буду поддерживать предположение MVC для дальнейших объяснений.
Библиотека FastRoute играет роль так называемого router ,По сути, он делает две вещи:
- Он содержит коллекцию маршрутов - определенную пользователем.
- Предоставляет механизм маршрутизации .Например, отправляет URI .Например, сопоставляет компоненты запроса (например, HTTP-метод и URI-путь ) с компонентами каждого маршрута (например, HTTP-метод маршрута и шаблон ), чтобы ПРОСТО извлекать обработчик маршрута (который может быть строкой типа "controller :: action" , или замыкание и т. д.) и список параметров (например, карта имен заполнителей, как определено в шаблоне маршрута , к их значениям, заданным пользователем в URI ).
Итак, маршрутизатор NOT (и не должен) вызыватьлюбое действие контроллера, но извлекает его только из свойства handler соответствующего объекта маршрута.На основе этого определения действия контроллера вы, разработчик, должны создать экземпляр контроллера, вызвать действие (также передавая значения из списка параметров в качестве аргументов действия) и распечатать результаты этого вызова для пользователя.
Все это происходит в одном файле, будь то index.php
.Итак, ваш класс контроллера создается в index.php
, ПОСЛЕ , маршрутизатор отправляет URI и возвращает имя контроллера, имя действия и список параметров.
В index.php
также происходитсоздание соединения с базой данных (например, экземпляра PDO в вашем случае), которое должно быть передано в качестве аргумента конструктору контроллера.