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

Yii всегда следовал одним и тем же принципам: быть производительным, гибким, но с хорошими настройками по умолчанию, ориентированным на практику, простым, явным и последовательным. Yii3 — не исключение.
Yii 1.1 и Yii 2.0 — хорошие фреймворки. Yii3 получился ещё лучше и устранил следующие недостатки:
Yii 2.0 имел закрытую экосистему. Было не всегда просто настроить сторонние PHP-пакеты, не предназначенные для фреймворка.
Некоторая магия и неявность. Нестандартное поведение объектов, введённое в Yii 2.0.
Совместимость со стандартами PHP и использование современного PHP отсутствовали из-за ограничений обратной совместимости.
Некоторые антипаттерны, такие как сервис локатор, доступный из коробки. Это влияло на общую тестируемость и поддерживаемость проектов в долгосрочной перспективе.
Далее мы кратко рассмотрим основные моменты этого долгожданного релиза. Вы можете ознакомиться с разделом Начало работы, если хотите отложить чтение и сначала попробовать.
Независимые пакеты
По сравнению с 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, мы серьёзно относимся к безопасности. Мы оценивали риски при реализации каждого пакета, будь то слой представления или абстракция базы данных.
Что у нас есть:
Абстракция контроля доступа
RBAC для контроля доступа
Абстракция пользователя для приложений
Middleware для обработки цепочек прокси и заголовков
Клиент для аутентификации через внешние сервисы
Также есть помощники для общих действий, связанных с безопасностью, таких как пакет защиты от 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 хелпер, который задаёт коды ответа и многое другое
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.
API-документация для всех пакетов — весь публичный API красиво отрендерен для просмотра
Readme и документация отдельных пакетов — объясняет, как использовать каждый отдельный пакет
Исключительные стандарты качества
Yii3 поддерживает исключительные стандарты качества кода во всех пакетах. Каждая строка проходит строгую проверку через несколько уровней автоматизированного тестирования и анализа.
Для всех пакетов у нас есть почти 100% покрытие тестами, строгие типы Psalm/PhpStan и близкий к 100% MSI. Каждое изменение кода проходит публичный code review. Все эти меры обеспечивают исключительно стабильную и предсказуемую основу для ваших проектов.
Пре��сказуемые релизы
Политика релизов — SemVer. Каждый пакет версионируется независимо. Патч-версии никогда ничего не ломают, исправляя ошибки. Минорная версия вводит улучшения и функции, но остаётся совместимой. Мажорная версия вводит несовместимые изменения, требующие обновления кода.
И многое другое
Есть ещё много всяких функций. Менее интересных, но очень важных:
Блокировки Mutex с различными бэкендами
Вероятно, мы забыли упомянуть некоторые части фреймворка. Очень уж их много. Исследуйте их самостоятельно и пишите в комментах.
Полезные ресурсы
Ниже приведены некоторые полезные ссылки:
Посмотрите красивый лендинг здесь.
Руководство находится здесь. Мы рекомендуем начать с «начало работы».
API-документация также доступна.
Пакеты Yii3. Не забудьте поставить им звёзды!
Спасибо!
Спасибо за вашу поддержку и терпение! Мы сделали это вместе. Все члены основной команды, участники сообщества и спонсоры.
Мы совершенно уверены, что кодовая база Yii3 будет хорошо служить нам как минимум в течение следующих 10 лет или даже больше.
Планы на будущее:
Улучшения руководства и недостающие части.
Больше релизов пакетов для обогащения экосистемы и инструментария. Очереди, панель отладки и Gii уже хорошо работают, но мы всё ещё полируем их.
Чтение отзывов, исправления и улучшения.
Улучшения веб-сайта.
С Новым годом! Наслаждайтесь!