Это случилось! 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 уже хорошо работают, но мы всё ещё полируем их.
Чтение отзывов, исправления и улучшения.
Улучшения веб-сайта.
С Новым годом! Наслаждайтесь!
