我有带有 uniq 字段的实体,inviteCode
.当我创建新实体时,我想自动设置一些随机代码,但此代码必须与数据库中存在的代码不同,您知道什么,您知道哪些做法?
/**
* @ORMTable(name="users")
* @ORMEntity
* @ORMHasLifecycleCallbacks
* @AssertBridgeUniqueEntity(
* groups={"registration"},
* fields="inviteCode",
* errorPath="not valid",
* message="This inviteCode is already in use."
* )
*/
class User extends AbstractUser implements UserInterface
{
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMColumn(type="string", length=500, unique=true)
* @AnnotationSerializedName("_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
。
但我相信教义在这个问题上存在一些东西,或者也许有人有很好的榜样
在这里提供了一个很好的答案 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。
为什么不使用 uuid?它作为核心功能包含在 php 中,我相信它适合您的需求。
在此处查看官方文档