原则 2 定义属性类型而不创建列



我有一个绑定到ZF/Laminas表单的地址实体。

某些属性已定义。如街道、乡村等。

/**
* @var string
*
* @ORMColumn(type="string", length=2)
*/
protected $country;
/**
* @var float
*
* @ORMColumn(type="float", nullable=true)
*/
protected $longitude;
/**
* @var float
*
* @ORMColumn(type="float", nullable=true)
*/
protected $latitude;

以及一个非存储属性,用于通过事件侦听器强制地理位置

/**
* @var bool
*/
protected $geolocation = true;

使用访问器

/**
* @param bool $geolocation
*
* @return self
*/
public function setGeolocation(bool $geolocation): self
{
$this->geolocation = $geolocation;
return $this;
}

问题出在通过访问器补水期间。"地理位置"的值来自字符串类型"1"或"0"(复选框(的形式

水化由DoctrineObject水化器进行,但财产不由ORM管理。因此,启用严格类型模式后,由于 setGeolocation(( 参数类型,会引发异常。

它应该适用于@ORMColumn(type="boolean")但我不想存储此值。

如何在不创建列的情况下定义实体属性?

我认为你对教义或水合作用没有问题,你在类型转换方面有问题。

当该值来自LaminasFormForm对象时,您应该使用InputFilter通过过滤器将值转换为 bool。然后,来自ObjectHydrator应从输入筛选器中获取值。

让我们看一下我的例子(为了简单起见,我在这里不使用教义(:

<?php
declare(strict_types=1);
class MyEntity
{
private bool $mycheckbox = false;
public function getMycheckbox(): bool
{
return $this->mycheckbox;
}
public function setMycheckbox(bool $mycheckbox): void
{
$this->mycheckbox = $mycheckbox;
}
}
use LaminasFormForm;
use LaminasInputFilterInputFilterProviderInterface;
use LaminasFormElement;
use LaminasFilter;
use LaminasHydratorClassMethods as Hydrator;
class MyForm extends Form implements InputFilterProviderInterface
{
public function init(): void
{
$this->add([
'name'    => 'mycheckbox',
'type'    => ElementCheckbox::class,
'options' => [],
]);
$this->setObject(new MyEntity());
$this->setHydrator(new Hydrator());
}
public function getInputFilterSpecification(): array
{
return [
'mycheckbox' => [
'filters' => [
// this filter is the important part
[
'name'    => FilterBoolean::class,
'options' => [],
]
],
],
];
}
}
$form = new MyForm();
$form->init();
$form->setData(['mycheckbox' => '1']);
var_dump($form->isValid());
var_dump($form->getInputFilter()->getValues());

var_dump($form->getObject());

此处的输出为:

bool(true)
array(1) {
'mycheckbox' =>
bool(true)
}
class MyEntity#9 (1) {
private $mycheckbox =>
bool(true)
}

最新更新