Symfony і основи HTTP - Symfony Framework Documentation documentation

  1. Крок 1: Клієнт відправляє запит
  2. Крок 2: Сервер повертає відповідь
  3. Запити, відповіді та веб-розробка
  4. Запити та відповіді в PHP
  5. Запити та відповіді в Symfony
  6. Об'єкт Symfony Request
  7. Об'єкт Symfony Response
  8. Подорож від запиту до відповіді
  9. Фронт-контролер
  10. Потік в додатку Symfony
  11. Підсумок: Потік запит-відповідь

Вітаємо! Вивчаючи Symfony, ви заодно вивчаєте основи мережі. Symfony побудована за моделлю HTTP Request-Response: це фундаментальна парадигма, яка коштує майже за всієї комунікацією в мережі.

У цій статті ви пройдете по основам HTTP і дізнаєтеся як вони застосовуються в Symfony.

HTTP (Hypertext Transfer Protocol або протокол передачі гіпертексту) - це текстова мова, що дозволяє двом комп'ютерам обмінюватися повідомленнями один з одним. Наприклад, при перегляді свіжого коміксу xkcd , Відбувається (приблизно) такий діалог:

Вітаємо

І хоча справжній мову більш формальний, все гранично просто. HTTP - це термін, який використовується для опису цього простого мови, заснованого на тексті. Мета вашого сервера завжди одна і та ж - розуміти прості текстові запити (requests) і повертати текстові відповіді (responses).

Symfony побудований навколо цієї реальності. Чи усвідомлюєте ви цей факт чи ні, але ви використовуєте HTTP кожен день. За допомогою Symfony ви зможете вивести це вміння на новий рівень.

Крок 1: Клієнт відправляє запит

Будь-який діалог в мережі починається з запиту. Запит - це текстові повідомлення, створене клієнтом (це може бути браузер, додаток на смартфоні і т.д.) в спеціальному форматі, відомому як HTTP. Клієнт відправляє цей запит серверу, а потім чекає відповідь.

Погляньте на першу частину взаємодії (запит) між браузером і веб-сервером xkcd:

Мовою HTTP цей запит буде виглядати приблизно так:

GET / HTTP / 1.1 Host: xkcd.com Accept: text / html User-Agent: Mozilla / 5.0 (Macintosh)

Це просте повідомлення містить всю необхідну інформацію про те, який саме ресурс запитує клієнт. Перший рядок HTTP запиту найбільш важлива - вона містить 2 речі: HTTP-метод (GET) і URL (/).

URI (наприклад /, / contact і т.д.) - це унікальна адреса або місце, яке визначає запитаний клієнтом ресурс. HTTP-метод (наприклад, GET) визначає, що саме клієнт хоче зробити з запитаним ресурсом. HTTP-методи (їх іноді називають дієсловами) визначають декілька типових способів взаємодії з запитаним ресурсом. Найуживаніші:

GET

Отримати ресурс з сервера (наприклад, при перегляді сторінки); POST Створити ресурс на сервері (наприклад, при відправці форми); PUT / PATCH Оновити ресурс на сервері (використовується в API); DELETE Видалити ресурс з сервера (використовується в API).

Запам'ятавши ці типи HTTP-методів, ви можете уявити собі, як буде виглядати HTTP-запит на видалення запису в блозі:

Note

Насправді все існує дев'ять HTTP-методів, визначених в специфікації протоколу HTTP, але багато хто з них дуже мало поширені або ж обмежено підтримуються. У реальному світі, багато сучасні браузери підтримують тільки методи POST і GET в HTML-формах. Проте інші HTTP-методи підтримуються в XMLHttpRequest .

На додаток до першому рядку, HTTP-запит завжди містить кілька інформаційних рядків, іменованих заголовками запиту (headers). У заголовках може міститися різна інформація, наприклад, запитаний Host, формати відповіді, які підтримує клієнт (Accept) або ж там може бути опис програми, з якою клієнт використовує для виконання запиту (User-Agent). Існує також багато інших заголовків, перелік яких ви можете знайти в Вікіпедії на сторінці List of HTTP header fields .

Крок 2: Сервер повертає відповідь

Як тільки сервер отримав запит, він точно знає, який ресурс потрібен клієнту (грунтуючись на URI) і що клієнт хоче з цим ресурсом зробити (на підставі HTTP-методу). Наприклад, якщо ми маємо справу з GET-запитом, сервер готує запитаний ресурс і повертає його у вигляді HTTP-відповіді. Розглянемо відповідь від web-сервера xkcd:

Розглянемо відповідь від web-сервера xkcd:

Перевівши на мову HTTP, відповідь, відправлений назад в браузер, буде виглядати приблизно так:

HTTP / 1.1 200 OK Date: Sat, 02 Apr 2011 21:05:05 GMT Server: lighttpd / 1.4.19 Content-Type: text / html <html> <! - ... HTML для коміксу xkcd -> < / html>

HTTP-відповідь (response) містить запитаний ресурс (в даному випадку це HTML-код сторінки), а також додаткові дані про самому відповіді. Перший рядок особливо важлива - вона містить код стану (status code) HTTP відповіді (в даному випадку 200).

Статус-код доносить інформацію про результат виконання запиту назад до клієнта. Запит був виконаний успішно? Або в ході виконання запиту була допущена помилка? Існують різноманітні коди стану, одні з яких говорять про успішне виконання запиту, інші - вказують на помилки, треті повідомляють, що клієнту необхідно виконати якесь додаткове дію (наприклад, перейти на іншу сторінку в разі редиректу). Повний список статус-кодів ви можете знайти сторінці в Вікіпедії list of HTTP status codes .

Подібно запитом, HTTP-відповідь містить додаткову інформацію, яка називається HTTP-заголовками. Тіло одного і того ж ресурсу може бути повернуто в безлічі різних форматів, включаючи HTML, XML або JSON. Для того, щоб повідомити клієнту, який саме формат іспользется, застосуються заголовок Content-Type зі значенням на зразок text / html. Переглянути список основних типів даних можна на IANA: List of common media types .

Існує багато різних заголовків, і деякі з них надають важливий функціонал. Наприклад, деякі заголовки можуть бути використані для створення системи кешування.

Запити, відповіді та веб-розробка

Обмін запитами-відповідями - це фундаментальний процес, на якому ґрунтується вся комунікація в мережі. Цей процес настільки важливий і функціональний, що його простота дивує.

Найважливіше полягає в наступному: незалежно від того, яку мову програмування ви використовуєте, яка програма створюєте (web, мобільне, JSON API) і навіть якийсь філософії програмування дотримуєтеся, кінцевою метою програми завжди буде зрозуміти запит, а потім створити і повернути відповідей.

Щоб дізнатися більше про специфікацію HTTP, почитайте оригінальну специфікацію HTTP 1.1 RFC або HTTP Bis , Який є спробою роз'яснити вихідну специфікацію і, крім того, постійно оновлюється.

Запити та відповіді в PHP

Як же вам обробити "запит" і створити "відповідь" за допомогою PHP? Насправді PHP трохи відволікає вас від всього процесу:

$ Uri = $ _SERVER [ 'REQUEST_URI']; $ Foo = $ _GET [ 'foo']; header ( 'Content-Type: text / html'); echo 'Запитаний URI:'. $ Uri; echo 'Значення параметра "foo":'. $ Foo;

Як би дивно це не звучало, це крихітне додаток насправді отримує інформацію з HTTP-запиту і використовує її для створення HTTP-відповіді. Замість того, щоб обробляти "сирий" HTTP-запит, PHP готує суперглобальні змінні, такі як $ _SERVER і $ _GET, які містять всю інформацію про запит. Аналогічно, замість того, щоб повертати текст відповіді, відформатований за правилами HTTP, ви можете використовувати PHP функцію header для створення заголовків відповідей і просто вивести на друк основний контент, який стане тілом відповіді. PHP створить правильний HTTP-відповідь і поверне його клієнту:

HTTP / 1.1 200 OK Date: Sat, 03 Apr 2011 2:14:33 GMT Server: Apache / 2.2.17 (Unix) Content-Type: text / html Запитаний URI: / testing? Foo = symfony Значення параметра "foo": symfony

Запити та відповіді в Symfony

На відміну від прямолінійного підходу PHP, Symfony надає два класи, які спрощують взаємодію з HTTP-запитом і відповіддю.

Об'єкт Symfony Request

клас Request - це об'єктів-орієнтоване уявлення HTTP-запиту. З його допомогою вся інформація із запиту знаходиться прямо у вас перед очима:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 use Symfony \ Component \ HttpFoundation \ Request; $ Request = Request :: createFromGlobals (); // запитаний URI (наприклад, / about) без query параметрів $ request -> getPathInfo (); // витягує змінні GET і POST відповідно $ request -> query -> get ( 'id'); $ Request -> request -> get ( 'category', 'default category'); // витягує змінні $ _SERVER $ request -> server -> get ( 'HTTP_HOST'); // витягує екземпляр UploadedFile за ідентифікатором "attachment" $ request -> files -> get ( 'attachment'); // витягує значення $ _COOKIE $ request -> cookies -> get ( 'PHPSESSID'); // витягує HTTP-заголовок запиту з нормалізованими ключами в нижньому регістрі $ request -> headers -> get ( 'host'); $ Request -> headers -> get ( 'content_type'); $ Request -> getMethod (); // наприклад, GET, POST, PUT, DELETE або HEAD $ request -> getLanguages ​​(); // список мов, прийнятих клієнтом, в масиві

Як бонус, клас Request виконує великий обсяг роботи у фоновому режимі, так що вам не доведеться піклуватися про багато речей. Наприклад, метод isSecure () перевіряє три різних значення в PHP, які вказують, підключається користувач по захищеному протоколу (HTTPS).

Об'єкт Symfony Response

Symfony також надає клас Response : Просте РHP-уявлення HTTP-відповіді. Це дозволяє вашому додатку використовувати об'єктно-орієнтований інтерфейс для створення відповіді, який потім потрібно буде повернути клієнту:

1 2 3 4 5 6 7 8 9 10 11 12 use Symfony \ Component \ HttpFoundation \ Response; $ Response = new Response (); $ Response -> setContent ( '<html> <body> <h1> Привіт, світ! </ H1> </ body> </ html>'); $ Response -> setStatusCode (Response :: HTTP_OK); // встановлює заголовок HTTP відповіді $ response -> headers -> set ( 'Content-Type', 'text / html'); // видає HTTP заголовок, а слідом за ним вміст $ response -> send ();

Також існують особливі під-класи відповідей, які спрощують створення: JSON , редиректів , стрімінга файлів

Tip

Класи Request і Response є частиною самостійного компонента під назвою symfony / http-foundation , Який ви можете використовувати в будь-якому проекті PHP (незалежно від Symfony). Він також надає класи для роботи з сесіями, завантаженими файлами і ін.

Якби можливості Symfony закінчувалися на вищепереліченому, у вас вже був би на руках набір інструментів для простого і швидкого отримання доступу до інформації із запиту, а також об'єктно-орієнтований інтерфейс для створення відповіді. Навіть коли ви освоїте більш потужні можливості Symfony, постарайтеся не забувати, що мета вашої програми завжди полягає в інтерпретації запиту і створення відповідного відповіді, грунтуючись на логіці вашого застосування.

Подорож від запиту до відповіді

Як і HTTP-протокол, об'єкти Request і Response досить прості. Найскладніша частина створення додатка полягає в описі процесів, які відбуваються між отриманням запиту і відправкою відповіді. Іншими словами, справжня робота полягає в тому, щоб написати код, який інтерпретує інформацію з запиту і створює відповідь.

Ваша програма напевно виконує багато функцій, таких як відправка email'ов, обробка відправлених форм, збереження чого-небудь в базу даних, відображення HTML-сторінок і захист контента правилами безпеки. Чи можна впоратися з усіма цими завданнями таким чином, щоб ваш код залишився добре організованим і легко підтримуваним? Symfony була створена спеціально щоб рішення цих проблем більше не лягало на ваші плечі.

Фронт-контролер

Традиційно додатки створювалися таким чином, щоб кожна "сторінка" сайту мала свій власний файл: (наприклад, index.php, contact.php, і т.д.).

При такому підході є цілий ряд проблем, включаючи негнучкість URLов (раптом вам буде потрібно змінити blog.php на news.php і при цьому зберегти всі ваші посилання?). Ще однією проблемою є необхідність вручну доповнювати кожен файл певним набором ключових файлів, що відповідають за безпеку, роботу з базами даних і дизайн сайту.

Набагато кращим рішенням буде використовувати фронт-контролер, єдиний PHP-файл, який відповідає за кожен запит, який надходить до вашого додатком. наприклад,

/index.php виконує index.php /index.php/contact виконує index.php /index.php/blog виконує index.php

Tip

Використовуючи правила перенаправлення (rewrite) в налаштуваннях веб-сервера , Index.php в адресі не буде потрібен і у вас будуть гарні, чисті URLи (наприклад, / show).

Тепер, кожен запит обробляється по одному і тому ж принципу. Замість того, щоб кожен URL відповідав окремому PHP-файлу - фронт-контролер виконується завжди і за допомогою маршрутизатора викликає різні частини вашого застосування, в залежності від URL.

Дуже простий фронт-контролер може виглядати так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // index.php use Symfony \ Component \ HttpFoundation \ Request; use Symfony \ Component \ HttpFoundation \ Response; $ Request = Request :: createFromGlobals (); $ Path = $ request -> getPathInfo (); // запитуваний URI if (in_array ($ path, array ( '', '/'))) {$ response = new Response ( 'Ласкаво просимо на головну сторінку'); } Elseif ( '/ contact' === $ path) {$ response = new Response ( 'Зворотній зв'язок'); } Else {$ response = new Response ( 'Сторінку не знайдено', Response :: HTTP_NOT_FOUND); } $ Response -> send ();

Це краще, але все одно багато однаковою роботи! На щастя, Symfony знову поспішає допомогу.

Потік в додатку Symfony

Додаток, що використовує фреймоворк Symfony теж використовує файл фронт-контролера. Але всередині, Symfony відповідальна за обробку кожного, хто входить запиту і рішення, що треба зробити:

Але всередині, Symfony відповідальна за обробку кожного, хто входить запиту і рішення, що треба зробити:

Вхідні запити обробляються Routing component і передаються в PHP-функції, які повертають об'єкти Response.

Поки що може здаватися, що в цьому немає сенсу, але якщо ви продовжите читати, ви дізнаєтеся про шляхах і контролерах : Двох фундаментальних частинах для створення сторінки. Але в процесі вивчення не забувайте, що не важливо наскільки складним стає ваш додаток, ваша робота залишається тією ж: читати інформацію з запиту і створювати відповідь.

Підсумок: Потік запит-відповідь

Що ми зрозуміли на даний момент:

  1. Клієнт (наприклад, браузер) відправляє HTTP запит (Request);
  2. Кожен запит запускає один і той же файл під назвою "фронт-контролером";
  3. Фронт-контролер завантажує Symfony і передає інформацію про запит;
  4. Всередині, Symfony використовує шляху і контролери для створення відповіді (Response): ми дізнаємося про це пізніше
  5. Symfony перетворює ваш об'єкт Response в текстові заголовки і тіло відповіді (тобто, HTTP-відповідь), який відправляється назад клієнту.

Запит був виконаний успішно?
Або в ході виконання запиту була допущена помилка?
Unix) Content-Type: text / html Запитаний URI: / testing?
Чи можна впоратися з усіма цими завданнями таким чином, щоб ваш код залишився добре організованим і легко підтримуваним?
Php і при цьому зберегти всі ваші посилання?

Дополнительная информация

rss
Карта