Doctrine Object Select 不作为对象补水
Doctrine Object Select not hydrating as object
我有一个带有字段集的表单,其中包含一个 Doctrine ObjectSelect 元素。
$this->add(array(
'name' => 'vatRate',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'label' => _('VAT Rate:'),
'object_manager' => $this->getEntityManager(),
'target_class' => 'Application\Entity\VatRates',
'property' => 'title',
'is_method' => true,
'find_method' => array(
'name' => 'getVatRatesOrderRate',
),
'label_generator' => function($targetEntity) {
return $targetEntity->getTitle() . ' (' . $targetEntity->getVatRate() . '%)';
},
'disable_inarray_validator' => TRUE,
),
));
在我的 invoiceItems 实体中我有
/**
* @var \Application\Entity\VatRates
*
* @ORM\ManyToOne(targetEntity="Application\Entity\VatRates")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="vat_rate_id", referencedColumnName="vat_rate_id")
* })
*/
private $vatRate;
/**
*
* @param VatRates|NULL $vatRate
* @return \Application\Entity\InvoiceItems
*/
public function setVatRate(VatRates $vatRate = NULL)
{
$this->vatRate = $vatRate;
return $this;
}
我遇到的问题是,当我验证表单时,Doctrine 的 DoctrineObject hydrator 在将 vatRate 传递给 setter 之前没有将其转换为实体。我收到以下错误。
Catchable fatal error: Argument 1 passed to Application\Entity\InvoiceItems::setVatRate() must be an instance of Application\Entity\VatRates, integer given, called in C:\Users\User\OneDrive\Documents\My Webs\freedomsnew\vendor\doctrine\doctrine-module\src\DoctrineModule\Stdlib\Hydrator\DoctrineObject.php on line 282 and defined in C:\Users\User\OneDrive\Documents\My Webs\freedomsnew\module\Application\src\Application\Entity\InvoiceItems.php on line 339
从错误消息中可以看出,整数 vatRateId 正在发送到 invoiceItems 实体 setVatRate 方法。
我以类似的方式进行了其他 forms/fieldsets 设置,并且都没有问题。有谁知道我在这里做错了什么?
问题是 Doctrine 缓存了实体。清除缓存解决了问题。
php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:clear-cache:query
php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:clear-cache:metadata
php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:clear-cache:result
我设置了一个批处理文件来从现在开始执行此操作。
我有一个带有字段集的表单,其中包含一个 Doctrine ObjectSelect 元素。
$this->add(array(
'name' => 'vatRate',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'label' => _('VAT Rate:'),
'object_manager' => $this->getEntityManager(),
'target_class' => 'Application\Entity\VatRates',
'property' => 'title',
'is_method' => true,
'find_method' => array(
'name' => 'getVatRatesOrderRate',
),
'label_generator' => function($targetEntity) {
return $targetEntity->getTitle() . ' (' . $targetEntity->getVatRate() . '%)';
},
'disable_inarray_validator' => TRUE,
),
));
在我的 invoiceItems 实体中我有
/**
* @var \Application\Entity\VatRates
*
* @ORM\ManyToOne(targetEntity="Application\Entity\VatRates")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="vat_rate_id", referencedColumnName="vat_rate_id")
* })
*/
private $vatRate;
/**
*
* @param VatRates|NULL $vatRate
* @return \Application\Entity\InvoiceItems
*/
public function setVatRate(VatRates $vatRate = NULL)
{
$this->vatRate = $vatRate;
return $this;
}
我遇到的问题是,当我验证表单时,Doctrine 的 DoctrineObject hydrator 在将 vatRate 传递给 setter 之前没有将其转换为实体。我收到以下错误。
Catchable fatal error: Argument 1 passed to Application\Entity\InvoiceItems::setVatRate() must be an instance of Application\Entity\VatRates, integer given, called in C:\Users\User\OneDrive\Documents\My Webs\freedomsnew\vendor\doctrine\doctrine-module\src\DoctrineModule\Stdlib\Hydrator\DoctrineObject.php on line 282 and defined in C:\Users\User\OneDrive\Documents\My Webs\freedomsnew\module\Application\src\Application\Entity\InvoiceItems.php on line 339
从错误消息中可以看出,整数 vatRateId 正在发送到 invoiceItems 实体 setVatRate 方法。
我以类似的方式进行了其他 forms/fieldsets 设置,并且都没有问题。有谁知道我在这里做错了什么?
问题是 Doctrine 缓存了实体。清除缓存解决了问题。
php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:clear-cache:query
php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:clear-cache:metadata
php ./vendor/doctrine/doctrine-module/bin/doctrine-module orm:clear-cache:result
我设置了一个批处理文件来从现在开始执行此操作。