我想创建一个唯一的ID,因此在我的Controller.php
中,我这样写:
use Symfony\Component\Validator\Constraints\Uuid;
以及以后在我的函数中:
$unique_id = $this->uuid = Uuid::uuid4();
但是我收到错误消息:
试图调用名为“ uuid4”的类的未定义方法 “ Symfony \ Component \ Validator \ Constraints \ Uuid”。
答案 0 :(得分:3)
在将对象持久保存到数据库时,只有原则可以为您自动生成uuid。您可以在实体中像这样进行设置。
/**
*
* @ORM\Id
* @ORM\Column(name="id", type="guid")
* @ORM\GeneratedValue(strategy="UUID")
*/
protected $id;
有时候这确实是个问题,当您立即需要uuid来获取代码中的进一步指令时,却无法在该时间点持久化该对象。因此,我在使用此程序包方面取得了良好的经验:
https://packagist.org/packages/ramsey/uuid
<?php
namespace YourBundle\Controller;
use Ramsey\Uuid\Uuid;
/**
* Your controller.
*
* @Route("/whatever")
*/
class YourController extends Controller
{
/**
* @Route("/your/route", name="your_route")
*/
public function yourFunction(Request $request)
{
try {
$uuidGenerator = Uuid::uuid4();
$uuid = $uuidGenerator->toString();
} catch (\Exception $exception) {
// Do something
}
}
}
答案 1 :(得分:2)
您可以使用https://packagist.org/packages/ramsey/uuid中的ramsey/uuid
composer require ramsey/uuid
安装后:
use Ramsey\Uuid\Uuid;
function generateUid()
{
return Uuid::uuid4();
}
您可以查看文档以获取更多信息。
答案 2 :(得分:0)
如果您向实体添加一个字段并需要为该字段自动生成 UUID,并且您已经拥有自动生成的自动增量 ID,那么您可以在持久化实体之前进行生成。
use Symfony\Component\Uid\Uuid;
// ...
/**
* @var string
*
* @ORM\Column(name="uuid", type="guid", unique=true)
*/
private $uuid;
/**
* @ORM\PrePersist()
*/
public function prePersist()
{
$this->setDateCreated($this->getDateCreated() ?: (new DateTime()));
$this->uuid = Uuid::v4()->toRfc4122();
}
此外,您可能需要修改迁移
public function preUp(Schema $schema) : void
{
$this->addSql('ALTER TABLE table_name ADD uuid CHAR(36) DEFAULT NULL COMMENT \'(DC2Type:guid)\'');
$this->addSql('CREATE UNIQUE INDEX UNIQ_1C1B038BD17F50A6 ON table_name (uuid)');
}
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('UPDATE table_name SET uuid = UUID()');
$this->addSql('ALTER TABLE table_name CHANGE uuid uuid CHAR(36) NOT NULL COMMENT \'(DC2Type:guid)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP INDEX UNIQ_1C1B038BD17F50A6 ON table_name');
$this->addSql('ALTER TABLE table_name DROP uuid');
}
这里解释了为什么 more than one autogeneration thru annotations doesn't work with Doctrine