scattercz/consistence-doctrine-symfony

Symfony 扩展包,整合 Consistence 库和 Doctrine ORM,支持 Symfony 5

3.0 2020-06-08 14:32 UTC

This package is auto-updated.

Last update: 2024-09-09 00:20:38 UTC


README

Travis CI

这是一个 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 枚举。有两个重要的事项需要注意

  1. ORM\Column(type="string_enum") 中的 type="string_enum" - 这将用于将值映射到数据库中,这意味着如果您有一个基于字符串的枚举(请参阅 Sex 中的值),则使用 string_enum

您可以为 ORM\Column 指定任何其他参数,就像您通常做的那样(null性、长度...)。

还有 integer_enumfloat_enumboolean_enum,可以分别用于它们各自的数据类型。

  1. @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'

安装

  1. 使用 Composer 安装包 scattercz/consistence-doctrine-symfony
composer require scattercz/consistence-doctrine-symfony
  1. 在您的应用程序中注册扩展包
// config/bundles.php
return [
	// ...
	Consistence\Doctrine\SymfonyBundle\ConsistenceDoctrineBundle::class => ['all' => true],
];

这就是全部,您可以开始了!