Вышли новые версии Doctrine ORM 3.3 и DBAL 4.2
Вышли очередные минорные версии Doctrine ORM 3.3 и DBAL 4.2.
Сразу последовало несколько релизов, включая отмену устаревшей логики.
Ниже приведены некоторые изменения новой версии Doctrine ORM 3.3 и DBAL 4.2.
Полный список изменений можно посмотреть тут и тут.
Undeprecation of PARTIAL Object Hydration
Начиная с Doctrine ORM 3.3 вы снова можете использовать синтаксис DQL SELECT PARTIAL
, а с Doctrine ORM 2.2 вы больше не будете получать сообщение об устаревании за его использование. Если ваше приложение использует частичные объекты с DQL, вы можете перейти с 2.2 на 3.3 прямо сейчас, не меняя их использование. Частичные объекты ведут себя точно так же (и имеют те же недостатки) в версиях 3 и 2.
Все это меняется с PHP 8.4 и его функцией ленивых объектов. С этой функцией мы сможем реализовать частичные объекты прозрачно для PHP. Это означает, что не нужно будет знать, является ли объект прокси, частичным объектом или полным объектом. Всякий раз, когда происходит доступ к недоступному свойству, Doctrine может загрузить его.
Поддержка PHP 8.4 и Property Hooks
Doctrine поддерживает PHP 8.4, начиная с Doctrine ORM 2.2 и Doctrine ORM 3.3, DBAL 4.
Пока что вы не можете использовать хуки свойств в сущностях. На данный момент, если вы попытаетесь создать хук свойств для сущности, Doctrine выдаст исключение. Планируется решить эту проблему в предстоящем выпуске Doctrine ORM 3.4.
Для MongoDB ODM поддержка PHP 8.4 зависит от завершения миграции с ProxyManager
на symfony/var-exporter
.
Поддержка типов баз данных ENUM
DBAL 4.2 теперь поддерживает новый тип Enum
, который в основном полезен для интроспекции схем баз данных, содержащих перечисления. Все значения перечисления анализируются из типа и доступны слою абстракции схемы.
Хотя мы не рекомендуем использовать тип enum в MySQL/MariaDB
из-за его необычной реализации, вы также можете использовать этот тип для прямого сопоставления столбцов с перечислениями в базе данных через ORM, начиная с версии 3.3.0:
class Subscription
{
#[Column(type: "enum", options: ['values' => ['future', 'active, 'cancelled', 'expired']))]
public string $state = 'future';
}
Вы также можете напрямую сопоставить перечисления с перечислениями MySQL и позволить Doctrine автоматически определить всю конфигурацию:
class Subscription
{
#[Column(type: Types::ENUM)]
public State $state = State::FUTURE;
}
enum State : string
{
case FUTURE = 'future';
case ACTIVE = 'active';
case CANCELLED = 'cancelled';
case EXPIRED = 'expired';
}
Кэш запросов и переменные пагинации
Если вы использовали setFirstResult()
и setMaxResults()
с запросами DQL, то вплоть до версии 2.20 Doctrine каждая комбинация первого результата и максимального результата приводит к собственной записи кэша разбора запроса DQL. Это может легко вывести размер кэша запроса из-под контроля.
Начиная с версии 2.20, анализатор DQL теперь работает в два этапа: на первом этапе генерируется кэшируемый результат, а на втором этапе кэшированный результат дополняется частью запроса LIMIT
(или другим эквивалентом базы данных).
Это более масштабное внутреннее изменение, но вполне возможно, что, особенно в сочетании с абстракцией Paginator
и объединениями выборки коллекций, в некоторых случаях это изменение может привести к сбоям при обновлении с 2.19 до 2.20.
Psalm и PHPStan в будущем
Было решено использовать только один инструмент статического анализа, и проекты Doctrine будут использовать PHPStan в дальнейшем. На данный момент проверки Psalm будут удалены из репозиториев.
Это в основном потому, что PHPStan обогнал Psalm по глубине и качеству за последние несколько лет, и кажется маловероятным, что Psalm может указать на проблему, которую PHPStan не обнаружил ранее.
Ссылка на источник: https://www.doctrine-project.org/2024/02/03/doctrine-orm-3-and-dbal-4-released.html