我一直在使用Symfony2和FosRestBundle开发REST api。 一切都工作正常,然后要求我必须混淆所有的资源ID。
我是通过在Doctrine中添加自定义类型来实现的。 但现在,我的协会工作不正常。
以下是代码示例: 在Track中我有:
/**
*
* @ORM\Column(name="id", type="encryptedid")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @expose
* @Groups({"FULL_ALBUM","FULL_TRACK","FULL_ARTIST","FULL_PLAYLIST","ARTIST_TRACKS","LIST_TRACKS"})
*
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Album", inversedBy="tracks")
* @expose
* @Groups({"FULL_TRACK","FULL_ARTIST"})
*/
private $album;
在相册中,我有:
/**
*
* @ORM\Column(name="id", type="encryptedid")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @expose
* @Groups({"FULL_ALBUM","FULL_TRACK","FULL_ARTIST","ARTIST_ALBUMS"})
*/
private $id;
/**
*
* @ORM\OneToMany(targetEntity="Track", mappedBy="album")
* @Groups({"FULL_ALBUM"})
* @expose
*/
private $tracks;
问题是当我使用自定义类型时,无法从ALBUM对象访问TRACKS。
注意:使用自定义类型时,doctrine:schema:validate给出:
[Mapping] OK - 映射文件正确。
[数据库]失败 - 数据库架构与当前映射文件不同步。
但是当我转换回INT id时会出现此消息。
我正在做的任何建议或错误?
以下是我的自定义类型:
<?php
namespace My\RestApiBundle\Type;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class EncryptedIdType extends Type {
private $service;
const MYTYPE = 'encryptedid'; // modify to match your type name
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
return $platform->getIntegerTypeDeclarationSQL($fieldDeclaration);
}
public function convertToPHPValue($value, AbstractPlatform $platform) {
$this->service = new \My\RestApiBundle\Service\MyEncrypter;
return $this->service->encrypt($value);
}
public function convertToDatabaseValue($value, AbstractPlatform $platform) {
$this->service = new \My\RestApiBundle\Service\MyEncrypter;
return $this->service->decrypt($value);
}
public function getName() {
return self::MYTYPE;
}
}
我已将其添加到以下代码中的学说中:
<?php
namespace My\RestApiBundle;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class MyRestApiBundle extends Bundle
{
public function boot()
{
$em = $this->container->get('doctrine.orm.entity_manager');
Type::addType('encryptedid', "My\RestApiBundle\Type\EncryptedIdType");
$em->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('encryptedid','encryptedid');
}
}