5

我使用 zf2.1.3 和教义 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');
}

此代码返回以下内容:

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'

所以我的问题是:为什么 Doctrine Hydrator 不适用于带有下划线的字段?我怎样才能使这项工作?

谢谢!

已编辑

抱歉很久没有回复。A 在我的工作上无权访问 SO!

我尝试了以下方法:

$hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo', false);

对于我在此处发布的示例,此false参数可以正常工作。

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

有人有线索吗?

4

3 回答 3

9

几个月后有人问过这个问题,但我刚才一直在检查DoctrineObjecthydrator 的源代码,我认为这就是发生的事情:

默认情况下,除非您使用标志构造DoctrineObject水合器 as ,否则水合器将在模式下工作。这意味着它会尝试从您尝试水合的值构造 getter 和 setter 方法名称,并且它这样做的方式是调用字段名称并将 get/set 附加到该名称之前。byValuefalsebyValueucfirst

因此,例如,您有cat_name,因此它将尝试getCat_name显然不正确的 getter 方法。

你有4个选择,那么:

  • A: camelCase你的变量名
  • B:设置byValue为 false (以便它尝试直接访问变量)[尽管我认为在这种情况下您可能必须公开变量......我不确定可见性将如何影响它,因为我没有之前试过]
  • C:使用不同的保湿剂Strategy
  • D:只有奇怪的 getter 和 setter 名称,例如getCat_name(请不要这样做)。
于 2013-10-04T22:26:52.220 回答
0

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

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

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

希望有所帮助

于 2014-11-08T14:50:02.540 回答
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;
    }
于 2014-03-11T17:34:51.420 回答