Requests и Responses в CodeIgniter 4

Лонни Эцелл (Lonnie Ezell), основной разработчик CodeIgniter 4, поделился в своем блоге информацией о новом функционале четвертой версии фреймворка.

Одним из самых больших изменений в CodeIgniter 4 является способ ввода и вывода обрабатываемых данных. В предыдущих версиях, в том числе последних версиях Codeigniter 3x, на входе и выходе для обработки данных были задействовано два класса, которые содержали в основном связанную функциональность — это класс Output и Input.

В CodeIgniter 4 HTTP слой смоделирован гораздо более тесно и построена новая иерархия классов для представления общих запросов и ответов HTTP.

IncomingRequest


Класс IncomingRequest обеспечивает доступ к запросам HTTP и всем данным на стороне, которые идут с ним, в том числе:

  • GET, POST, SERVER и ENV переменные
  • Заголовки
  • Печеньки (Куки)
  • Объекты URL
  • Загруженные файлы

И предоставляет удобные методы для таких вещей, как:

  • IP-адрес клиента
  • Был ли это AJAX-запрос?
  • Был ли это запрос CLI?
  • Происходит ли все через HTTPS?

Здесь уже другой класс запросов, который является более универсальным и не знает подробностей-запроса HTTP, который содержит такие вещи как GET и POST переменные. Запрос может быть одним из двух: входящий запрос, о том, что браузер клиента отправил на сервер, и исходящий, посылаемый на внешний сервер.

Response


Класс ответа, который используется для того, чтобы построить свой ответ клиенту. Здесь можно назначить заголовки, установить выход напрямую, и многое другое. Он предоставляет удобные методы для таких вещей, как:

  • Установку соответствующих не-кэша заголовков
  • Работа с заголовками кэширования HTTP
  • Перенаправление на новую страницу

Пример использования:


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

class Home extends \CodeIgniter\Controller
{
    public function index()
    {
        echo "Hello World!";
    }
}

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

class Home extends \CodeIgniter\Controller
{
    public function __construct(...$params)
    {
        parent::__construct(...$params);

        // Этот контроллер доступен только через HTTPS
        if (! $this->request->isSecure())
        {
            // // Переадресовать пользователя на эту страницу с помощью HTTPS, и установить HSTS
            // заголовок так, что браузер будет автоматически преобразовывать все ссылки на эту страницу с HTTPS
            // в течение следующего года
            force_https();
        }
    }

    public function index()
    {
        $data = [
            ...
        ];

        // Установка некоторых правил кэширования HTTP для этой страницы.
        $this->response->setCache([
            'max-age' => 300,
            's-max-age' => 900,
            'etag' => 'foo'
        ]);

        // Возврат JSON
        $this->response->setContentType('application/json')
                       ->setOutput(json_encode($data));
    }
}


В этом примере, были сделаны три основные вещи:

  1. Мы заставили эту страницу получить доступ через HTTPS обоими перенаправлениями на версию HTTPS текущего URL, а также путем создания заголовка Strict-Transport-Security, который поддерживается большинством основных производителей браузеров и позволяет браузеру преобразовать URL в HTTPS автоматически перед отправкой запроса.
  2. Произвели установку некоторых правила кэширования HTTP, чтобы помочь браузеру знать, когда он может повторно использовать данные, которые он уже имеет. Это означает меньшее количество HTTP-запросов и увеличение производительности загрузки.
  3. Произвели вывод некоторых необходимых данных в формате JSON.

Стоит также отметить, что Lonnie Ezell пообещал делиться краткими обзорами о новом функционале фреймворка каждые несколько недель.


Ссылки по теме:


CodeIgniter Wikipedia: ru.wikipedia.org/wiki/CodeIgniter
Официальный сайт CodeIgniter: www.codeigniter.com
Официальный форум CodeIgniter: forum.codeigniter.com
Блог Лонни Эцелла: Requests и Responses in Codeigniter 4
HSTS: https://ru.wikipedia.org/wiki/HSTS
CLI: https://ru.wikipedia.org/wiki/Call_Level_Interface
CodeIgniter 4: https://habrahabr.ru/post/275657/
CI Community Apps: https://habrahabr.ru/post/276375/

Комментарии (10)


  1. Mylistryx
    03.03.2016 18:27
    -2

    Автор, у вас русский язык родной? Попробуйте перечитать то, что вы разместили.


    1. condor-bird
      03.03.2016 18:37
      +1

      Я читал то, что я разместил. Конкретизируйте Ваш вопрос. Что именно имеете ввиду?


      1. glebovgin
        03.03.2016 20:26
        -4

        Ну, допустим:

        Объекты URL объект URL, который в настоящее время рассматривается в

        Это про что, простите?


        1. condor-bird
          03.03.2016 20:35

          Опечатка. О них можно было сообщить и в личку.


  1. L0NGMAN
    03.03.2016 23:36

    Почему изобретают велосипед? Почему не использовать Request и Response из пакета Symfony http-foundation?


    1. condor-bird
      04.03.2016 00:10
      +2

      В данном случае свое родное решение будет намного эффективнее и легче. CodeIgniter не будет идти по стопам Laravel и задействовать компоненты Symfony.


    1. zelenin
      04.03.2016 03:23
      +3

      Вообще-то закономернее вопрос про PSR-7. Заходя в статью, был уверен, что именно об этом здесь прочту. Ан нет, свой велосипед. В 2016 году.


      1. OnYourLips
        05.03.2016 03:22

        Мне кажется, что они не смогли разобраться, либо подумали, что их пользователи не смогут. Это более-менее разумное предположение.
        Остальные из разряда теорий заговоров: например, привязать пользователя к себе, чтобы они не смогли использовать другие PSR-7 библиотеки.
        Но адекватной причины я все равно не вижу.


        1. zelenin
          05.03.2016 03:30

          а что там мочь? psr7 лишь стандартизированная версия того, что раньше писалось в каждом фреймворке с нуля.
          А причина на самом деле банальна: большинство фреймворков пишут средние программисты со средним кругозором, как бы по молодости не казалось иначе.


    1. Sky4eg
      04.03.2016 09:08
      +3

      Вот ответ на этот вопрос самого Lonnie Ezell

      There was a lot of discussion among the Council about whether to use that or another HTTP solution (like Zend's new PSR7 compatible one). In Symfony's case, the sheer size of HTTP Foundation was a part of it. And when you pick that collection, it's not just the Request/Response stuff you're bringing it, it's quite a bit more.

      In the end, we decided it didn't fit the goals set out for CodeIgniter. There are plenty of other frameworks that do us it, though, and to fine effect.