Это случилось! Yii3 официально выпущен после многих лет интенсивной разработки и полировки.

Yii всегда следовал одним и тем же принципам: быть производительным, гибким, но с хорошими настройками по умолчанию, ориентированным на практику, простым, явным и последовательным. Yii3 — не исключение.

Yii 1.1 и Yii 2.0 — хорошие фреймворки. Yii3 получился ещё лучше и устранил следующие недостатки:

  1. Yii 2.0 имел закрытую экосистему. Было не всегда просто настроить сторонние PHP-пакеты, не предназначенные для фреймворка.

  2. Некоторая магия и неявность. Нестандартное поведение объектов, введённое в Yii 2.0.

  3. Совместимость со стандартами PHP и использование современного PHP отсутствовали из-за ограничений обратной совместимости.

  4. Некоторые антипаттерны, такие как сервис локатор, доступный из коробки. Это влияло на общую тестируемость и поддерживаемость проектов в долгосрочной перспективе.

Далее мы кратко рассмотрим основные моменты этого долгожданного релиза. Вы можете ознакомиться с разделом Начало работы, если хотите отложить чтение и сначала попробовать.

Независимые пакеты

По сравнению с Yii 1.1 и Yii 2.0, которые были монолитными фреймворками, Yii3 представляет собой экосистему с более чем 130 официальными пакетами. Эти пакеты могут использоваться как в любом PHP-коде так и как целый фреймворк, относительно похожий на Yii 2.0 или Yii 1.1. Шаблоны приложений очень помогают в этом случае.

Шаблоны приложений

Из коробки доступны три шаблона приложений:

  • Web — для классических серверных приложений.

  • API — для API.

  • Console — для консольных инструментов и фоновых процессов.

В отличие от Yii 2.0, они очень минималистичны, поэтому вы начинаете с базовых вещей, таких как маршрутизация, конфигурация, DI-контейнер и окружение, уже собранных вместе. Дополнительная функциональность, такая как подключение к базе данных, по умолчанию отсутствует в шаблонах. Устанавливайте только то, что вам нужно — ничего лишнего.

Возможность использовать любые пакеты

Вместо того чтобы сосредоточиться на специфичных для Yii расширениях, как это было в Yii 2.0, мы сделали фреймворк так, чтобы он хорошо работал с любыми PHP-пакетами, доступными на Packagist, будь то PSR-совместимые пакеты, пакеты Symfony или обычный PHP-код. Контейнер способен настроить любой из них.

Yii3 охватывает всю экосистему PHP вместо того, чтобы изобретать велосипед. Он легко интегрируется с любой PHP-библиотекой. Никакого вендор-лока. Никаких проприетарных API. Только современные стандарты PHP, позволяющие вам использовать инновации всей экосистемы.

Первоклассный DI-контейнер

Центральной частью фреймворка является его контейнер внедрения зависимостей. Он объединяет все отдельные пакеты, автоматически разрешая зависимости и помогая получить запрашиваемые классы. Обычное его использование очень простое и явное:

return [
   // Сопоставление интерфейса с классом
   EngineInterface::class => EngineMarkOne::class,
 
   // Детальная конфигурация
   MyServiceInterface::class => [
       'class' => MyService::class,
       '__construct()' => [42],
       'setDiscount()' => [10],
   ],

   // Фабричные замыкания
   'api' => static fn(ApiConfig $config) => new ApiClient($config),
];

// Зависимости автоматически внедряются на основе типизации

final readonly class MyController
{
   public function __construct(
       private CacheInterface $cache
   ) {}
}

Другим преимуществом контейнера является то, что он очень быстр и работает целиком во время выполнения. Ваша конфигурация — это то, что фактически выполняется, поэтому нет никакой магии, и вы даже можете пошагово отлаживать код с помощью XDebug, если это нужно.

Конфигурация

Мы взяли способы настройки из Yii 2.0, похожий на шаблон advanced. В нём есть поддержка несколько окружений, переопределение конфигурации и т.д. Конфигурация в Yii3 очень мощная и может быть настроена для практически любой структуры проекта. По умолчанию шаблоны приложений предоставляют конфигурацию, которая разделена на web (или API) и консоль, а также общую часть. Конфигурация разделена на две основные: конфигурация DI-контейнера, которая сопоставляет настроенные классы с интерфейсами, и параметры, которые используются для настройки этих классов.

'yiisoft/view' => [
    'basePath' => null,
    'parameters' => [
        'assetManager' => Reference::to(AssetManager::class),
        'applicationParams' => Reference::to(ApplicationParams::class),
        'aliases' => Reference::to(Aliases::class),
        'urlGenerator' => Reference::to(UrlGeneratorInterface::class),
        'currentRoute' => Reference::to(CurrentRoute::class),
    ],
],
  
'yiisoft/yii-view-renderer' => [
    'viewPath' => null,
    'layout' => '@src/Web/Shared/Layout/Main/layout.php',
    'injections' => [
        Reference::to(CsrfViewInjection::class),
    ],
],

Безопасность

Как и в Yii 1.1 и Yii 2.0, мы серьёзно относимся к безопасности. Мы оценивали риски при реализации каждого пакета, будь то слой представления или абстракция базы данных.

Что у нас есть:

Также есть помощники для общих действий, связанных с безопасностью, таких как пакет защиты от CSRF.

В документации есть специальная страница про безопасность. На уровне проекта есть процессы реагирования на проблемы.

Базы данных

В Yii 2.0 реализован замечательный слой абстракции базы данных. Сначала мы извлекли его в отдельный пакет, а затем переосмыслили и улучшили. В результате получился yiisoft/db, который предоставляет доступ к базе данных, управление схемой и мощный построитель запросов. Дополнительные инструменты и хранилища, такие как миграции, кэширование в базе и т.д., были реализованы поверх DB. Также поверх была сделана более явная, но не менее удобная реализация Active Record.

$posts = $connection
   ->select(['id', 'title', 'created_at'])
   ->from('{{%posts}}')
   ->where(['status' => 'published'])
   ->andWhere(['>', 'views', 1000])
   ->orderBy(['created_at' => SORT_DESC])
   ->limit(10)
   ->all();

Помимо нашего собственного слоя базы данных, вы можете использовать Cycle ORM или Doctrine, делать запросы с помощью PDO или нативных драйверов. Используйте то, что вы предпочитаете. Yii3 не заставляет вас придерживаться какой-то одной реализации.

Абстракция данных

Мощная абстракция данных yiisoft/data и виджеты для неё, такие как grid view, идеально подходят для создания мощных универсальных админок. Абстракция включает форматирование данных, постраничную разбивку, сортировку и возможность использовать любой источник данных с любым представлением и наоборот.

Кэширование

Кэширование стало ещё более продвинутым, чем в Yii 2.0. Во-первых, из коробки есть защита от cache stampede. Во-вторых, драйверы кэша совместимы с PSR-16. Это означает, что вы можете использовать любую реализацию PSR-16 для очень специфичного хранилища, и она будет работать сразу.

Следующие бэкенды уже реализованы нашей командой:

  • APCu

  • DB

  • Files

  • Memcached

  • Redis

Стандарты прежде всего

Подобно кэшированию, фреймворк использует интерфейсы PSR для многих компонентов:

  • Логирование. Вы можете либо использовать логгер Yii, либо заменить его на что-то типа Monolog, если предпочитаете его.

  • Middleware. Можете использовать любые решения из Packagist, такие как обработка CORS, без каких-либо изменений в коде.

  • Абстракция запроса-ответа, которая даёт оптимальное тестирование и режим worker.

  • Даже DI-контейнер может быть либо заменён, либо объединён с другим PSR-совместимым контейнером.

Архитектура, ориентированная на стандарты, гарантирует, что ваш код менее зависим от реализации и у вас есть возможность использовать самые современные PHP пакеты.

Режим Worker

В традиционных PHP-серверах инициализация фреймворка и подключение к базе данных выполняются для каждого запроса, что не очень хорошо для производительности. Yii3 может работать в режиме worker вместе с RoadRunner, Swoole или FrankenPHP. В этом режиме он инициализируется один раз, а затем обслуживает множество циклов запрос-ответ, что даёт значительное сокращение времени отклика.

Хотя этот режим замечательно работает, состояние у нас общее между несколькими циклами запрос-ответ, поэтому разработчики должны позаботиться об его изоляции (или вообще не хранить его) и потенциальных утечках памяти. Yii3 очень помогает в этом: все пакеты были разработаны либо без использования какого-либо состояния, либо с правильным сбросом его при каждом начале запроса.

Всё для классических веб-приложений

Не каждый проект должен быть API с клиентом, поэтому всё для классических серверных веб-приложений также доступно: виджеты, представления с поддержкой шаблонизаторов, таких как Twig, формы, управление ассетами, HTML-хелпер и т.д.

Кроме того, есть готовые к использованию виджеты для Bootstrap 5 и Bulma.

Набор инструментов для создания API

Yii3 предоставляет множество инструментов, которые помогают создавать API:

  • Data response, который заботится о представлении данных.

  • Поддержка Swagger.

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

HTTP-слой и сеть

Yii3 работает со слоем HTTP на более низком уровне, чем предыдущие версии фреймворка, и при этом следует интерфейсам PSR. Поверх этих относительно низкоуровневых интерфейсов есть удобные абстракции:

  • HTTP хелпер, который задаёт коды ответа и многое другое

  • Cookies

  • Download Response Factory для отправки файлов из приложения

Кроме того, есть сетевые утилиты для работы с IP-протоколом.

Пользовательский ввод и валидатор

В Yii3 есть мощный валидатор на атрибутах, возможность заполнять формы данными из HTTP (input-http) или откуда-либо ещё, инструменты для работы с формами и многое другое.

<?php

declare(strict_types=1);

namespace App\Web\Echo;

use Yiisoft\FormModel\FormModel;
use Yiisoft\Validator\Label;
use Yiisoft\Validator\Rule\Length;

final class Form extends FormModel
{
    #[Label('Сообщение')]
    #[Length(min: 2)]
    public string $message = '';
}

Хелперы

Доступны различные хелперы для упрощения общих задач программирования.

Интернационализация

Поскольку сообщество фреймворка Yii и члены основной команды не из какой-то одной страны, а со всего мира, мы серьёзно относимся к интернационализации и очень хорошо её понимаем.

Из коробки Yii3 имеет:

  • Перевод сообщений с форматированием ICU на базе intl.

  • Поддержка на уровне представления.

  • Поддержка в роутере.

Тестирование

Правильная инверсия зависимостей упрощает юнит-тестирование кода, созданного с помощью Yii3. Следование PSR для запроса и ответа позволяет выполнять API-тестирование без фактического запуска HTTP-сервера.

Чтобы ещё больше упростить тестирование, набор специфичных для тестирования реализаций PSR предоставляется yiisoft/test-support.

Обработка ошибок

Мы ценим время разработчиков. Поэтому уделяем внимание сообщениям об ошибках и странице ошибок. Вы никогда не увидите просто "Error". Сообщения предоставляют контекст. Кроме того, мы сделали ещё лучше придумав «дружественные исключения». В режиме разработки они отображаются информационным блоком, который объясняет, почему произошла ошибка и как её, вероятно, исправить. В будущем мы попытаемся предоставить кнопку, которая автоматически попытается применить исправление.

Страница ошибок содержит саму ошибку. Для каждого уровня стектрейса она отображает исходный код. Стро��а, где произошла ошибка, выделена. Элементы трейса, которые являются частью пакетов фреймворка, по умолчанию свёрнуты, потому что они настолько протестированы, что маловероятно, что ошибка там.

Сам обработчик, yiisoft/error-handler, ещё интереснее, чем в Yii2. Он обрабатывает ошибки нехватки памяти и фатальные ошибки, может сопоставлять определённые типы исключений с пользовательскими исключениями, отвечать в различных форматах и т.д.

Кроме того, есть пакет для интеграции с Sentry.

Документация

Доступны:

Исключительные стандарты качества

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

Для всех пакетов у нас есть почти 100% покрытие тестами, строгие типы Psalm/PhpStan и близкий к 100% MSI. Каждое изменение кода проходит публичный code review. Все эти меры обеспечивают исключительно стабильную и предсказуемую основу для ваших проектов.

Пре��сказуемые релизы

Политика релизов — SemVer. Каждый пакет версионируется независимо. Патч-версии никогда ничего не ломают, исправляя ошибки. Минорная версия вводит улучшения и функции, но остаётся совместимой. Мажорная версия вводит несовместимые изменения, требующие обновления кода.

И многое другое

Есть ещё много всяких функций. Менее интересных, но очень важных:

Вероятно, мы забыли упомянуть некоторые части фреймворка. Очень уж их много. Исследуйте их самостоятельно и пишите в комментах.

Полезные ресурсы

Ниже приведены некоторые полезные ссылки:

Спасибо!

Спасибо за вашу поддержку и терпение! Мы сделали это вместе. Все члены основной команды, участники сообщества и спонсоры.

Мы совершенно уверены, что кодовая база Yii3 будет хорошо служить нам как минимум в течение следующих 10 лет или даже больше.

Планы на будущее:

  1. Улучшения руководства и недостающие части.

  2. Больше релизов пакетов для обогащения экосистемы и инструментария. Очереди, панель отладки и Gii уже хорошо работают, но мы всё ещё полируем их.

  3. Чтение отзывов, исправления и улучшения.

  4. Улучшения веб-сайта.

С Новым годом! Наслаждайтесь!