scattercz / consistence-doctrine-symfony
Symfony 扩展包,整合 Consistence 库和 Doctrine ORM,支持 Symfony 5
Requires
- php: ~7.3
- consistence/consistence-doctrine: ~1.2|~2.0
- doctrine/doctrine-bundle: ~1.0|~2.0
- symfony/config: ~3.0|~4.0|~5.0
- symfony/dependency-injection: ~3.0|~4.0|~5.0
- symfony/http-kernel: ~3.0|~4.0|~5.0
- symfony/yaml: ~3.0|~4.0|~5.0
Requires (Dev)
README
这是一个 Symfony 扩展包,提供对独立包
consistence/consistence-doctrine
的集成,如果你不使用 Symfony,请遵循那里的说明。
此扩展包提供了对 Consistence 值对象的集成,以便您可以在实体中使用它们。
目前,所需的唯一集成是 枚举,以下为示例。
此扩展包已更新,现在可以在 Symfony 5 和 PHP 7.4 中运行。
用法
枚举 代表预定义的值集,当然,您可能还想将这些值存储在数据库中。由于 枚举
是对象,并且您只想存储代表值,因此必须进行某些映射。
以下是一个示例,其中您想为您的 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")
中的type="string_enum"
- 这将用于将值映射到数据库中,这意味着如果您有一个基于字符串的枚举(请参阅Sex
中的值),则使用string_enum
您可以为 ORM\Column
指定任何其他参数,就像您通常做的那样(null性、长度...)。
还有 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 require scattercz/consistence-doctrine-symfony
- 在您的应用程序中注册扩展包
// config/bundles.php return [ // ... Consistence\Doctrine\SymfonyBundle\ConsistenceDoctrineBundle::class => ['all' => true], ];
这就是全部,您可以开始了!