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