HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Главная содержательная часть в файле<em>index.php</em>- обработчик запроса:</p>
1 <p>Главная содержательная часть в файле<em>index.php</em>- обработчик запроса:</p>
2 <p>Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается обработчик (функция, handler), который выполняет необходимые действия и возвращает ответ.</p>
2 <p>Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается обработчик (функция, handler), который выполняет необходимые действия и возвращает ответ.</p>
3 <p>В Slim все приложение представлено объектом класса Slim\App. Этот объект содержит методы на каждый глагол HTTP: get, post, put и так далее. Эти методы принимают на вход два параметра:</p>
3 <p>В Slim все приложение представлено объектом класса Slim\App. Этот объект содержит методы на каждый глагол HTTP: get, post, put и так далее. Эти методы принимают на вход два параметра:</p>
4 <ul><li>Адрес или маршрут, для которого вызовется обработчик</li>
4 <ul><li>Адрес или маршрут, для которого вызовется обработчик</li>
5 <li>Обработчик. Лямбда-функция с двумя параметрами $request и $response</li>
5 <li>Обработчик. Лямбда-функция с двумя параметрами $request и $response</li>
6 </ul><p>Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. Это соответствует идеям<a>REST</a>. То есть<em>GET /users</em>и<em>POST /users</em>с точки зрения большинства фреймворков - разные маршруты со своими обработчиками. В этом достаточно просто убедиться, если определить соответствующие маршруты и выполнить к ним запросы с помощью curl:</p>
6 </ul><p>Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. Это соответствует идеям<a>REST</a>. То есть<em>GET /users</em>и<em>POST /users</em>с точки зрения большинства фреймворков - разные маршруты со своими обработчиками. В этом достаточно просто убедиться, если определить соответствующие маршруты и выполнить к ним запросы с помощью curl:</p>
7 <p>Перед тем как двигаться дальше, обязательно попробуйте повторить примеры выше в вашей локальной среде. Это важно для понимания дальнейшего контента.</p>
7 <p>Перед тем как двигаться дальше, обязательно попробуйте повторить примеры выше в вашей локальной среде. Это важно для понимания дальнейшего контента.</p>
8 <p>Первое, что бросается в глаза, - у нас всего один входной файл для всех адресов. Пользователь может запрашивать сколь угодно сложный адрес<em>/companies/3/photos5</em>. Всё сведется к запуску файла<em>index.php</em>, а сам адрес становится лишь значением $_SERVER['REQUEST_URI']:</p>
8 <p>Первое, что бросается в глаза, - у нас всего один входной файл для всех адресов. Пользователь может запрашивать сколь угодно сложный адрес<em>/companies/3/photos5</em>. Всё сведется к запуску файла<em>index.php</em>, а сам адрес становится лишь значением $_SERVER['REQUEST_URI']:</p>
9 <p>. ├── site │ └── public │ └── index.php</p>
9 <p>. ├── site │ └── public │ └── index.php</p>
10 <p>Такой подход имеет название<em>FrontController</em>в противовес подходу, когда каждый адрес фактически отображался на конкретный файл файловой системы -<em>PageController</em>.</p>
10 <p>Такой подход имеет название<em>FrontController</em>в противовес подходу, когда каждый адрес фактически отображался на конкретный файл файловой системы -<em>PageController</em>.</p>
11 <p>В интернете до сих пор встречаются сайты, построенные по этой модели, но она давно вышла из употребления. Заметить ее легко. Если есть адреса наподобие /users.php, то почти наверняка в корне сайта лежит файл<em>users.php</em>, который отвечает за обработку этой страницы:</p>
11 <p>В интернете до сих пор встречаются сайты, построенные по этой модели, но она давно вышла из употребления. Заметить ее легко. Если есть адреса наподобие /users.php, то почти наверняка в корне сайта лежит файл<em>users.php</em>, который отвечает за обработку этой страницы:</p>
12 <p>. ├── site │ └── public │ └── home.php │ └── users.php │ └── companies.php</p>
12 <p>. ├── site │ └── public │ └── home.php │ └── users.php │ └── companies.php</p>
13 <p>Во<em>FrontController</em>процесс поиска нужного обработчика называется диспетчеризацией, по аналогии с тем как это слово используется в оффлайн жизни. Пошагово он выглядит так:</p>
13 <p>Во<em>FrontController</em>процесс поиска нужного обработчика называется диспетчеризацией, по аналогии с тем как это слово используется в оффлайн жизни. Пошагово он выглядит так:</p>
14 <p>До входа во фреймворк:</p>
14 <p>До входа во фреймворк:</p>
15 <ol><li>Клиент выполняет запрос к веб-серверу, расположенному на сервере. Клиент - это не обязательно браузер, в примере выше клиентом выступает программа<em>curl</em></li>
15 <ol><li>Клиент выполняет запрос к веб-серверу, расположенному на сервере. Клиент - это не обязательно браузер, в примере выше клиентом выступает программа<em>curl</em></li>
16 <li>Веб-сервер перенаправляет запрос на<em>index.php</em>и устанавливает правильные параметры запроса</li>
16 <li>Веб-сервер перенаправляет запрос на<em>index.php</em>и устанавливает правильные параметры запроса</li>
17 </ol><p>После входа в сам PHP (именно это и есть диспетчеризация):</p>
17 </ol><p>После входа в сам PHP (именно это и есть диспетчеризация):</p>
18 <ol><li>Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, добавленные в объект $app (как в примерах в начале урока) с тем, что пришло. Он сравнивает комбинацию метода запроса и сам адрес. Этот процесс называется роутингом или маршрутизацией. А место, где внутри хранятся все добавленные маршруты, называют роутером</li>
18 <ol><li>Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, добавленные в объект $app (как в примерах в начале урока) с тем, что пришло. Он сравнивает комбинацию метода запроса и сам адрес. Этот процесс называется роутингом или маршрутизацией. А место, где внутри хранятся все добавленные маршруты, называют роутером</li>
19 <li>Если в процессе роутинга был найден соответствующий маршрут, то вызывается его обработчик</li>
19 <li>Если в процессе роутинга был найден соответствующий маршрут, то вызывается его обработчик</li>
20 <li>Ответ, сформированный обработчиком, отправляется обратно клиенту</li>
20 <li>Ответ, сформированный обработчиком, отправляется обратно клиенту</li>
21 </ol><p>Рассмотрим конкретный пример. Возьмем за основу следующий код:</p>
21 </ol><p>Рассмотрим конкретный пример. Возьмем за основу следующий код:</p>
22 <p>После запуска этого кода формируется роутер, который содержит в себе три маршрута:</p>
22 <p>После запуска этого кода формируется роутер, который содержит в себе три маршрута:</p>
23 <p>GET / GET /companies POST /companies</p>
23 <p>GET / GET /companies POST /companies</p>
24 <p>Теперь предположим, что клиент выполнил такой запрос:</p>
24 <p>Теперь предположим, что клиент выполнил такой запрос:</p>
25 <p>Веб-сервер запустил<em>index.php</em>, который проинициализировал объект $app. Затем фреймворк сопоставил маршруты и нашел, что за этот запрос отвечает<em>POST /companies</em>. Далее фреймворк вызвал обработчик, который вернул клиенту ответ:<em>POST /companies</em>.</p>
25 <p>Веб-сервер запустил<em>index.php</em>, который проинициализировал объект $app. Затем фреймворк сопоставил маршруты и нашел, что за этот запрос отвечает<em>POST /companies</em>. Далее фреймворк вызвал обработчик, который вернул клиенту ответ:<em>POST /companies</em>.</p>
26 <p>Если фреймворк не обнаружит соответствия, например, клиент запросит страницу<em>/comments</em>, то он возьмет управление на себя по умолчанию и автоматически отдаст браузеру ответ<em>404</em>. Так он говорит о том, что страница не найдена.</p>
26 <p>Если фреймворк не обнаружит соответствия, например, клиент запросит страницу<em>/comments</em>, то он возьмет управление на себя по умолчанию и автоматически отдаст браузеру ответ<em>404</em>. Так он говорит о том, что страница не найдена.</p>
27 <p>Всегда нужно внимательно смотреть, какие делаются запросы и есть ли подходящие под них ответы, чтобы не думать о том, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика браузера:</p>
27 <p>Всегда нужно внимательно смотреть, какие делаются запросы и есть ли подходящие под них ответы, чтобы не думать о том, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика браузера:</p>
28 <p>Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.</p>
28 <p>Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.</p>