我想创建唯一的ID,比如dujUSJue9389sjgjik.
我已经使用了Doctrine的UUID策略来创建它们,但结果类似于d9c363ae-a1b7-11e6-a66d-9e9923e30d94:我不喜欢破折号的使用,而且我想要更短的ID.
他们必须识别一些实体来构建像http://example.com/entity/hduicw43tv43bic这样的URL.
使用PHP的uniqid()并不能保证生成的值的唯一性.我认为冲突是非常罕见的,但是,无论如何,根本不排除,所以我不认为它是“安全的”(冲突可能会导致异常并且行创建可能会导致很多问题需要解决).
所以,使用Doctrine和Symfony,我正在寻找一种方法来生成像ajybUYBD74883bj8d74NJ这样的值,并检查它的唯一性.如果它已经存在,则必须生成新值.一旦实体具有唯一值,就可以保留它.生成应该在创建实体时发生.
有关如何实现这一点的任何想法?
解决方法:
所以,混合@Jakub Matczak建议的answer by @Matteo和answer by psyloss我想出了这个:
class Company
{
/**
* @var string
*
* @ORM\Column(name="id", type="string")
* @ORM\Id
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class="AppBundle\Doctrine\IdGenerator")
*/
private $id;
...
然后
namespace AppBundle\Doctrine;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Id\AbstractIdGenerator;
use Ramsey\Uuid\Uuid;
/**
* {@inheritdoc}
*/
class IdGenerator extends AbstractIdGenerator
{
/**
* {@inheritdoc}
*/
public function generate(EntityManager $em, $entity)
{
$uuid = Uuid::uuid4()->getHex();
if (null !== $em->getRepository(get_class($entity))->findOneBy(['id' => $uuid])) {
$uuid = $this->generate($em, $entity);
}
return $uuid;
}
}
此生成器还检查具有相同名称的现有实体,如果需要,重新生成UUID并保证唯一性.
生成的值正是我想要的:7b165049eb224f548021f68caefc57f6.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。