【问题标题】:Doctrine2 Custom Type Not Returning DataDoctrine2 自定义类型不返回数据
【发布时间】:2013-11-27 21:12:09
【问题描述】:

最近两天我很后悔,因为我想到我可以创建加密的自定义类型,以便在该类型中完成数据的加密和解密,这样我就不需要每次都调用这些函数,通常是为了让我的生活更轻松,但它把它变成了人间地狱:/

我的自定义类型是按照我的意图在数据库中插入加密数据,但问题是当我需要检索数据时,这里是保存从数据库检索的数据的对象的打印

    Uapi\CoreBundle\Entity\Request Object
(
    [id:Uapi\CoreBundle\Entity\Request:private] => 2
    [clientIPAdress:Uapi\CoreBundle\Entity\Request:private] => 
    [clientHost:Uapi\CoreBundle\Entity\Request:private] => 
    [clientISP:Uapi\CoreBundle\Entity\Request:private] => 
    [clientOS:Uapi\CoreBundle\Entity\Request:private] => 
    [clientOSVersion:Uapi\CoreBundle\Entity\Request:private] => 
    [clientBrowser:Uapi\CoreBundle\Entity\Request:private] => 
    [clientBrowserVersion:Uapi\CoreBundle\Entity\Request:private] => 
    [clientLanguage:Uapi\CoreBundle\Entity\Request:private] => 
    [clientCountry:Uapi\CoreBundle\Entity\Request:private] => 
    [clientCity:Uapi\CoreBundle\Entity\Request:private] => 
    [possibleProxy:Uapi\CoreBundle\Entity\Request:private] => 
    [proxyIPAdress:Uapi\CoreBundle\Entity\Request:private] => 
    [torExitNode:Uapi\CoreBundle\Entity\Request:private] => 
    [maliciousInput:Uapi\CoreBundle\Entity\Request:private] => 
    [maliciousInputLog:Uapi\CoreBundle\Entity\Request:private] => 
    [serverIPAdress:Uapi\CoreBundle\Entity\Request:private] => 
    [serverPort:Uapi\CoreBundle\Entity\Request:private] => 
    [requestMethod:Uapi\CoreBundle\Entity\Request:private] => 
    [requestTimeFloat:Uapi\CoreBundle\Entity\Request:private] => P�a�;
)

这是我的加密类型类定义

    use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Uapi\CoreBundle\Provider\EncryptionProvider;

class EncryptedType extends Type {

    const ENCRYPTED = 'encrypted';

    public function getName()
    {
        return self::ENCRYPTED;
    }

    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) {
        return $platform->getVarcharTypeDeclarationSQL($fieldDeclaration);
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform) {
        return ($value === null)? null : base64_encode(EncryptionProvider::getCrypter()->encrypt($value));
    }

    public function convertToPHPValue($value, AbstractPlatform $platform) {
        return ($value === null)? null : base64_decode(EncryptionProvider::getCrypter()->decrypt($value));
    }
}

我确实在核心捆绑类的引导函数中注册了它

 $connection = $this->container->get('doctrine')->getConnection();
        if(!Type::hasType('encrypted'))
        {
            Type::addType('encrypted', 'Uapi\CoreBundle\System\DBALType\EncryptedType');
            $connection->getDatabasePlatform()->registerDoctrineTypeMapping('encrypted', 'encrypted');
        }

【问题讨论】:

  • 这里有什么问题?什么不工作?有什么例外吗?你已经尝试了什么?
  • 只是阅读问题,我在这里边缘,我没有从数据库中获取数据,正如您从打印对象中看到的那样,他只有空属性
  • 阅读什么问题 "man" ?我在您非常详细的“question”中的任何地方都看不到问号...顺便说一句,自定义类型通常添加到您的app/config/config.yml 或一些doctrine.dbal.types 下的DoctrineBundle 的配置部分中导入到那里的文件包含doctrine 配置...请参阅configuration reference。只是我的几分钱“man”:)
  • 虽然您添加自定义类型的方式可能不会导致问题......即因为真正的问题很可能与您对自定义类型本身的实现有关。 .. 我建议您仍然首先在doctrine.dbal.types 下添加您的类型symfony-way,以确保您当前的实现不会导致此或任何其他问题。
  • 您能否删除问题或添加您的发现/最终工作解决方案作为答案?这样其他用户也可以从中受益。

标签: symfony doctrine-orm custom-type


【解决方案1】:

我自己解决了这个问题,它不是一般问题,但在这里解释得不好。我需要首先定义一个 EncryptionProvider,它是我的实现 PHPSecLib\AES 的类。所以这是正确的

public function boot()
{
    new EncryptionInit();
    EncryptionProvider::setCrypter(EncryptionProvider::AES, $this->container->getParameter('uapi_core.security_key'), $x = array());

    $connection = $this->container->get('doctrine')->getConnection();
    if(!Type::hasType('encrypted'))
    {
        Type::addType('encrypted', 'Uapi\CoreBundle\System\DBALType\EncryptedType');
        $connection->getDatabasePlatform()->registerDoctrineTypeMapping('encrypted', 'encrypted');
    }


 }

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 2016-08-02
    • 2017-06-22
    • 2013-08-16
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多