Одним из самых больших изменений в 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