consistence-community / consistence-doctrine-symfony
Symfony 扩展,将 Consistence 库与 Doctrine ORM 集成
Requires
- php: ~8.0
- consistence-community/consistence-doctrine: ^2.1.1
- doctrine/doctrine-bundle: ~2.2
- symfony/config: ^5.4|^6.0
- symfony/dependency-injection: ^5.4|^6.0
- symfony/http-kernel: ^5.4|^6.0
- symfony/yaml: ^5.4|^6.0
Requires (Dev)
- consistence-community/coding-standard: 3.11.1
- phing/phing: 2.17.1
- php-parallel-lint/php-parallel-lint: 1.3.1
- phpunit/phpunit: 9.5.13
Replaces
README
此包是社区维护的 consistence/consistence-doctrine-symfony
的分支,以支持新的 PHP 版本。
这是一个提供独立包
consistence-community/consistence-doctrine
集成的 Symfony 扩展,如果你不使用 Symfony,请参考那里的说明。
此扩展提供了对 Consistence 值对象与 Doctrine ORM 的集成,以便你在实体中使用它们。
目前,所需的唯一集成是 枚举,请参见下面的示例。
使用方法
枚举代表一组预定义值,当然,你也会想将这些值存储在数据库中。由于 枚举
是对象,而你只想存储表示的值,因此需要进行一些映射。
以下示例展示了你如何为你的 User
保存性别
<?php namespace Consistence\Doctrine\Example\User; class Sex extends \Consistence\Enum\Enum { public const FEMALE = 'female'; public const MALE = 'male'; }
现在你可以在你的 User
实体中使用 Sex
枚举。有两个重要的事项需要注意
ORM\Column
中的type="string_enum"
- 这将用于将值映射到数据库,这意味着如果你有一个基于字符串的枚举(参见Sex
中的值),请使用string_enum
你可以像通常那样指定任何其他 ORM\Column
参数(nullability,length...)。
还有 integer_enum
、float_enum
和 boolean_enum
,分别用于它们的类型。
@Enum(class=Sex::class)
- 这将用于从数据库中重新加载值时重建Sex
枚举对象
class
注解参数使用与其他 Doctrine 注解相同的命名空间解析过程,因此它与在关联映射中指定 targetEntity
实际上是相同的。
<?php namespace Consistence\Doctrine\Example\User; use Consistence\Doctrine\Enum\EnumAnnotation as Enum; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity() */ class User extends \Consistence\ObjectPrototype { // ... /** * @Enum(class=Sex::class) * @ORM\Column(type="string_enum", nullable=true) * @var \Consistence\Doctrine\Example\User\Sex|null */ private $sex; // ... public function __construct( // ... Sex $sex = null // ... ) { // ... $this->sex = $sex; // ... } // ... }
现在一切准备就绪,当你调用 flush
时,只有 female
会被保存
<?php namespace Consistence\Doctrine\Example\User; $user = new User( // ... Sex::get(Sex::FEMALE) // ... ); /** @var \Doctrine\ORM\EntityManager $entityManager */ $entityManager->persist($user); // when persisting User::$sex to database, `female` will be saved $entityManager->flush();
当你从数据库中检索实体时,你将再次收到 Sex
枚举对象
<?php namespace Consistence\Doctrine\Example\User; /** @var \Doctrine\ORM\EntityManager $entityManager */ $user = $entityManager->find(User::class, 1); var_dump($user->getSex()); /* class Consistence\Doctrine\Example\User\Sex#5740 (1) { private $value => string(6) "female" } */
这意味着对象的 API 是对称的(你得到你设置的相同类型),你可以开始从 枚举 中受益,例如确保你得到的是一个有效的值,以及能够在表示的值之上定义方法。
配置
你可以覆盖内部使用的服务,例如,如果你想在生产中使用更有效的缓存(这是推荐的),你可以提供具有 别名 的自定义实例。
services: mycache: class: Doctrine\Common\Cache\FilesystemCache arguments: - '%kernel.cache_dir%/mycache' consistence.doctrine.enum.enum_fields_cache: '@mycache'
安装
- 使用Composer安装包
consistence-community/consistence-doctrine-symfony
composer require consistence-community/consistence-doctrine-symfony
- 在您的应用程序中注册此包
// config/bundles.php return [ // ... Consistence\Doctrine\SymfonyBundle\ConsistenceDoctrineBundle::class => ['all' => true], ];
完成,您已准备好开始使用!