我正在使用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);
参数可以正常工作。
但是,当我在表格上绑定课程时它没有用!
有人有线索吗?
答案 0 :(得分:9)
有人问过这几个月之后,我刚刚检查了DoctrineObject
保湿器的源代码,我认为这是正在发生的事情:
默认情况下,除非您使用DoctrineObject
标记byValue
构建false
保湿器,否则保湿器将以byValue
模式运行。这意味着它试图从你试图补充的值构造getter和setter方法名称,它的方式是通过在字段名称上调用ucfirst
并将get / set添加到。
所以,例如,你有cat_name
,所以它会尝试明显不正确的getter方法getCat_name
。
您有4个选择,然后:
camelCase
您的变量名称byValue
设置为false(以便它尝试直接访问变量)[虽然我认为在这种情况下你可能必须公开变量...我我不确定能见度会如何影响它,因为我之前没有尝试过] Strategy
或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}
希望帮助