Doctrine 2 Hydrator - 带下划线的字段

时间:2013-03-11 01:28:38

标签: doctrine-orm zend-framework2

我正在使用zf2.1.3和doctrine 2.我试图在课堂上保存信息,并意识到DoctrineModule\Stdlib\Hydrator\DoctrineObject不适用于在其上加下划线的字段,例如{{1} }。

这是一个例子:

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');
}

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

谢谢!

被修改

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

我尝试了以下内容:

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'

对于我在此处发布的示例,此$hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo', false); 参数可以正常工作。

但是,当我在表格上绑定课程时它没有用!

有人有线索吗?

3 个答案:

答案 0 :(得分:9)

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

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

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

您有4个选择,然后:

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

答案 1 :(得分:0)

又快又脏......

foreach ($form as $key => $value) {
        while ($pos = strrpos($key,'_')) {                                  
            $key = substr_replace($key, '', $pos, 1);
            $capitalized = strtoupper($key[$pos]);
            $key[$pos] = $capitalized;                                
        }
        $data[$key] = $value;
    }

答案 2 :(得分:0)

你仍然可以使用这个技巧:

/** @ORM\Column(name="column_name", type="string") */
protected $columnName;

function get(...);
function set($columnName){$this->columnName = $columnName}

希望帮助