Symfony2& FOSRestBundle:从MySQL的BINARY(16)字段中获取UUID

时间:2014-10-30 17:37:26

标签: symfony doctrine-orm uuid fosrestbundle jmsserializerbundle

我正面临着与UUID有关的奇怪问题。

我使用Symfony2 + FOSRestBundle + JMSSerializer开发了一个REST API。由于我需要从两个来源更新一些表,我想到使用UUID作为一个实体的主键。

我做了一个学说:mapping:import在我的Symfony项目中生成实体。一切都正确。我最终得到了以下实体(为了简单起见,只暴露了关键字段和生成的getter):

<?php 
namespace Stardigita\TgaAPIBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * TgaBookings
 *
 * @ORM\Table(name="tga_bookings", indexes={[...]})
 * @ORM\Entity
 */
class TgaBookings
{
    /**
     * @var string
     *
     * @ORM\Column(name="book_cd_booking_UUID", type="blob", length=16, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
    */
    private $bookCdBookingUuid;

    /**
     * Get bookCdBookingUuid
     *
     * @return string 
    */
    public function getBookCdBookingUuid()
    {
        return $this->bookCdBookingUuid;
    }
...

未生成任何setter。我仍然可以自己做,我会,因为我需要事先知道密钥。

此字段的数据以BINARY(16)的形式正确存储在表中。当我恢复调用REST GET方法的数据时,我得到了这个:

[
{
    "book_cd_booking_uuid": "Resource id #1244",
    "book_cd_booking": 8,
    ....

我的问题是:如何从现场获取实际数据?

我想在现场吸气器中必须要做些什么,但我尝试了一些解决方案而没有任何成功。

感谢。

更新: 我已设法记录实际数据,以这种方式修改getBookCdBookingUuid方法:

    /**
     * Get bookCdBookingUuid
     *
     * @return string 
    */
    public function getBookCdBookingUuid()
    {
        return bin2hex($this->bookCdBookingUuid);
    }

并将类型更改为&#34; guid&#34;在属性注释中:

/**
 * @var string
 *
 * @ORM\Column(name="book_cd_booking_UUID", type="guid", length=16, nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $bookCdBookingUuid;

我在日志中正确表示了十六进制UUID,然后在控制器中返回结果:

[2014-11-03 19:52:07] app.ERROR: 1046684e5f6711e4a09f00089bce936a [] []

但是仍然有关于UTF无效字符的异常:

request.CRITICAL: Uncaught PHP Exception RuntimeException: "Your data could not be encoded because it contains invalid UTF8 characters." at /var/www/tga_api/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php line 36 {"exception":"[object] (RuntimeException: Your data could not be encoded because it contains invalid UTF8 characters. at /var/www/tga_api/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php:36)"} []

此外,我没有得到该服务的回复。返回500错误。

拜托,我需要解决这个问题。欢迎任何想法。

感谢。

1 个答案:

答案 0 :(得分:1)

GeneratedValue

我注意到您正在使用注释@ORM\GeneratedValue(strategy="IDENTITY")作为UUID属性。 IDENTITY表示数据库应该/将使用自动增量,在使用UUID时不应该这样做。请将其更改为@ORM\GeneratedValue(strategy="NONE")或完全删除。

转换

UUID的字符串形式(如01234567-89ab-cdef-0123-456789abcdef)在数据库中保留时应转换为二进制形式,并在从数据库中提取时转换回来。

最简单的方法是引入自定义类型。有关示例,请参阅here

错误

Doctrine(甚至master / 2.5)在关联中使用UUID存在一些问题。我试图在PR #1178中解决这些问题。

如果您需要关联中的UUID并且不能等到它被修复,那么使用常规整数ID并使UUID是一个单独的列。