【问题标题】:Symfony unique integer fields in entity实体中的 Symfony 唯一整数字段
【发布时间】:2017-11-07 19:49:34
【问题描述】:

我有带有 uniq 字段的实体,inviteCode。当我创建新实体时,我想自动设置一些随机代码,但是这个代码必须与数据库中存在的不同,你是什么,你知道什么做法?

/**
 * @ORM\Table(name="users")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @AssertBridge\UniqueEntity(
 *     groups={"registration"},
 *     fields="inviteCode",
  *     errorPath="not valid",
 *     message="This inviteCode is already in use."
 * )
 */
 class User extends AbstractUser implements UserInterface
 {
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string", length=500, unique=true)
 * @Annotation\SerializedName("_invite_code")
 */
private $inviteCode;

我发现了类似的东西

    private function calculateReference($number)
{
    $multipliers = array(7,3,1);
    $length = strlen($number);
    $numberArr = str_split($number);

    $sum = 0;

    for ($i = $length - 1; $i >= 0; --$i)
    {
        $sum += $numberArr[$i] * $multipliers[($length - 1 - $i) % 3];
    }

    return $number.(10 - $sum % 10) % 10;
} 

首先从表中获取最大 id,然后使用 id 调用函数 calculateReference,然后调用 setInviteCode

但我相信学说在这个问题上存在一些东西,或者也许有人对此有很好的例子

【问题讨论】:

  • 您会以何种方式使用您的邀请码?请给我们一些所需功能的背景,以推动您找到最佳解决方案:)

标签: symfony doctrine-orm unique-constraint


【解决方案1】:

有人在这里提供了很好的答案https://stackoverflow.com/a/13917309/4173130

但就像他最后说的那样,你不需要教义来实现这样一个简单的功能。在构造函数中生成代码是一种高效、简单、清晰的解决方案。

您可以使用像 ramsey/uuid 这样的 UUID 库。然后您就可以使用Uuid::uuid4(); 生成任何随机代码。

另一种解决方案是将random_bytes()base64_encode 一起使用:base64_encode(random_bytes(32))

请不要尝试创建新函数来生成随机值。大多数时候它并不安全,请参阅https://www.owasp.org/index.php/Insecure_Randomness

【讨论】:

  • ramsey/uuid 的 uniq 数据呢? uuid生成数据后需要在数据库中检查inviteCode吗?以及如何获取和设置数据,例如$uuid = Uuid::uuid4(); $user->setInviteCode($uuid->jsonSerialize());
  • 就像我说的,只需在构造函数中生成代码即可。然后你可以使用 Doctrine Type 或字符串来存储数据。
【解决方案2】:

为什么不使用 uuid?它作为核心功能包含在 php 中,我相信它适合您的需求。

查看官方文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多