Вышла новая версия Doctrine ORM 2.9

Дата публикации: 2021-05-25
Просмотры: 1818

Вышла очередная минорная версия Doctrine ORM 2.9.
Это первая версия, которая поддерживает атрибуты PHP 8.
Это позволит проще описывать сущности БД.
Так же сделан очередной шаг к стандартизации.

Вышла новая версия Doctrine ORM 2.9

Ниже приведены некоторые изменения новой версии Doctrine ORM 2.9.
Полный список изменения можно посмотреть тут.

Описание атрибутов

В следующем примере приведены примеры аннотаций для описания свойств сущностей БД.

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping AS ORM;

#[ORM\Entity(repositoryClass: PostRepository::class)]
class Post
{
    #[ORM\Column(type: Types::INTEGER)]
    #[ORM\Id, ORM\GeneratedValue(strategy: 'AUTO')]
    private ?int $id;

    #[ORM\Column(type: Types::BOOLEAN)]
    private bool $published = false;

    #[ORM\Column(type: Types::SIMPLE_ARRAY)]
    private array $text = [];

    #[ORM\ManyToOne(targetEntity: User::class)]
    public $author;

    #[ORM\ManyToMany(targetEntity: Tag::class)]
    #[ORM\JoinTable(name: "post_tags")]
    #[ORM\JoinColumn(name: "post_id", referencedColumnName: "id")]
    #[ORM\InverseJoinColumn(name: "tag_id", referencedColumnName: "id")]
    public Collection $tags;
}

Типизированные значения свойств по умолчанию

Начиная с PHP 7.4 типы свойств можно объявлять прямо в классах. Поэтому Doctrine теперь использует эти объявления типов, чтобы не дублировать тоже самое в аннотациях:

  • Столбцам не нужно определять тип
  • ManyToOne и OneToOne не нуждаются в указании сущностей для связей

Пример:

use Doctrine\ORM\Mapping AS ORM;

#[ORM\Entity(repositoryClass: UserRepository::class)]
class User
{
    #[ORM\Id, ORM\Column, ORM\GeneratedValue]
    public ?int $id = null;

    #[ORM\Column]
    public \DateTime $created;

    #[ORM\ManyToOne]
    public Email $email;
}

Query::HINT_READ_ONLY

Добавлена возможность указывать сущности выбранные только для чтения для текущего сеанса. Это работает если они уже не были раньше загружены для записи:

$dql = 'SELECT u FROM ' . ReadOnlyEntity::class . ' u WHERE u.id = ?1';

$query = $entityManager->createQuery($dql);
$query->setParameter(1, $user->id);
$query->setHint(Query::HINT_READ_ONLY, true);

$user = $query->getSingleResult();

Index/UniqueConstraints с использованием имен полей

Вместо указания имен столбцов БД для объявления индексов или уникальности теперь можно альтернативно использовать имена полей сущности.

use Doctrine\ORM\Mapping AS ORM;

#[ORM\Entity]
#[ORM\Index(fields: ["isPublished"])]
class Post
{
    #[ORM\Column]
    public bool $isPublished = false;
}

Это упрощает описание, поскольку имена столбцов не обязательно должны быть известны.

INDEX BY по ассоциациям

Раньше INDEX BY был недоступен для ассоциаций, теперь вы можете это делать:

$dql = 'SELECT p, u FROM Post INDEX BY p.author JOIN p.author u WHERE p.id = 3';

Устаревшие

Doctrine ORM 2.9 переосмысливает устаревшие версии и интегрируется с нашей новой библиотекой doctrine/deprecations.

  • Не рекомендуется, merge() и detach() пока нет доступных замен
  • Уведомление о сохранении отслеживания изменений: вместо этого используйте явное отслеживание изменений
  • Использование SELECT PARTIAL, вместо SELECT NEW с Value Objects
  • EntityManager::flush() с аргументами
  • EntityManager::clear() с аргументами (используйте detach)
  • Именованные запросы в описание (используйте Repository)
  • cli-config.php для настройки консольных команд, используйте EntityManagerProvider вместо этого
  • Устарело doctrine/cache, вместо этого используйте PSR-6 стандарт

Устаревшие кешировение и PSR-6

В следующих версиях doctrine откажется от использования doctrine/cache и заменим его PSR-6. Если вы все еще используете doctrine/cache в приложениях, обязательно установите версию «^ 1.10» в composer.json. Подробности

Поддержка PHP 7.1

ORM 2.9 представляет поддержку PHP 7.1, потому что технически он все равно не поддерживался. Никаких изменений кода не потребовалось, чтобы разрешить это снова, за исключением набора тестов.

Поддержка PHP 7.1 была повторно добавлена, чтобы обеспечить очень широкий подход к подготовке некоторых устаревших версий, которые представлены в ORM 2 и будут удалены в версии 3.0.

Поддержка стандарта кодирования

Doctrine ORM 2.9 теперь поддерживает и полностью соответствует требованиям Doctrine Coding Standard версии 9.0+. Это значительно улучшает автоматические проверки PR, поскольку все новые нарушения в PR вылавливаются и вставляются в PR в виде комментариев.


Ссылка на источник: https://www.doctrine-project.org/2021/05/24/orm2.9.html

Поделиться статьей:

Комментарии (6):

Авторизуйтесь, для того, чтобы оставить комментарий. Войти на сайт
avatar
avenue18 avenue18
2023-06-03 10:25
Какие нужные слова... супер, великолепная фраза
avatar
avenue18 avenue18
2023-06-03 07:47
Подтверждаю. Это было и со мной. Можем пообщаться на эту тему. Здесь или в PM.
avatar
DavidMoile DavidMoile
2023-06-05 10:31
В этом вся прелесть!
avatar
DavidMoile DavidMoile
2023-06-05 06:55
По моему мнению Вы не правы. Я уверен. Давайте обсудим это. Пишите мне в PM, пообщаемся.
avatar
avenue17 avenue17
2023-06-19 12:25
Мне кажется это великолепная идея
avatar
avenue17 avenue17
2023-06-19 08:37
Вы не правы. Я уверен. Могу отстоять свою позицию. Пишите мне в PM, пообщаемся.
Подписка на новости
Узнавайте о новых статьях первыми.
Профиль