Doctrine 2 Hydrator - 带下划线的字段

vin*_*a87 5 doctrine-orm zend-framework2

我使用zf2.1.3和doctrine 2.我试图在我的课上保持信息,并意识到它DoctrineModule\Stdlib\Hydrator\DoctrineObject不适用于有下划线的字段,比如cat_id.

这是一个例子:

/* namespace Application\Entity; */

class Foo
{
    private $cat_id;
    private $cat_name;

    public function getCatId()
    {
        return $this->cat_id;
    }

    public function setCatName($name)
    {
        $this->cat_name = $name;
        return $this;
    }

    public function getCatName()
    {
        return $this->cat_nome;
    }
}

class Bar
{
    private $id;
    private $name;

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }

    public function getName()
    {
        return $this->nome;
    }
}

/* namespace Application\Controller; */

use \DoctrineModule\Stdlib\Hydrator\DoctrineObject;
public function indexAction()
{
    $hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo');
    $foo = $hydrator->hydrate(array('cat_name' => 'Frank Moraes'), new Foo());
    \Zend\Debug\Debug::dump($foo, 'Foo Hydrator');

    $hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Bar');
    $bar = $hydrator->hydrate(array('name' => 'Frank Moraes'), new Bar());
    \Zend\Debug\Debug::dump($inscrit, 'Bar Hydrator');
}
Run Code Online (Sandbox Code Playgroud)

此代码返回以下内容:

Foo Hydrator
object(Application\Entity\Foo)
    private 'cat_id' => null
    private 'cat_name' => null

Bar Hydrator
object(Application\Entity\Foo)
    private 'id' => null
    private 'name' => 'Frank Moraes'
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:为什么Doctrine Hydrator不适用于有下划线的字段?我怎样才能做到这一点?

谢谢!

编辑

很抱歉很长时间没有回答.我的工作无法访问SO!

我尝试了以下方法:

$hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo', false);
Run Code Online (Sandbox Code Playgroud)

对于我在这里发布的示例,此false参数工作正常.

但是,当我在表单上绑定类时,它不起作用!

有人有线索吗?

osd*_*iab 9

在问了几个月之后,我刚刚检查了DoctrineObject保湿器的源代码,我认为这是正在发生的事情:

默认情况下,除非您DoctrineObject使用byValue标记构建水化器,否则false水化器将以byValue模式运行.这意味着它试图从你试图补充的值中构造getter和setter方法名称,并且它的方式是通过调用ucfirst字段名称并将get/set添加到其中.

所以,例如,你有cat_name,所以它将尝试getCat_name明显不正确的getter方法.

你有4个选择,然后:

  • 答: camelCase你的变量名
  • B:设置byValue为false(以便它尝试直接访问变量)[虽然我认为你可能必须在这种情况下公开变量...我不确定可见性会如何影响它,因为我没有之前尝试过]
  • C:使用不同的水合作用Strategy
  • D:只是有奇怪的getter和setter名称getCat_name(请不要这样做).

  • 感谢您发布此内容!我通过将变量名称更改为camelCase来解决这个问题.很高兴知道这个问题的原因! (2认同)