我有一个 Doctrine 实体,它有一个字符串字段,我正在尝试将其更改为可嵌入的以使用更好的抽象。
我创建了新类,更改了字段类型,然后用于渲染精细的模板停止工作。
这是实体定义:
declare(strict_types=1);
namespace App\Entity;
/**
* Security.
*
* @ORM\Table(name="security")
* @ORM\Entity(repositoryClass="App\Repository\SecurityRepository")
*/
class Security
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private int $id;
/**
* @ORM\Column(name="symbol", type="string", length=255, nullable=true)
*
* @todo rename to ticker?
*/
private ?string $symbol = null;
/**
* @ORM\Column(type="string", length=9, nullable=true, unique=true)
*/
private ?CUSIP $cusip;
/**
* @return SecurityPrice
*/
public function getPriceAt(DateTimeInterface $d): ?SecurityPrice
{
$foundPrices = $this->getPrices()->filter(fn(SecurityPrice $price) => $price->getDate() == $d);
return !$foundPrices->isEmpty() ? $foundPrices->first() : null;
}
public function getCusip(): ?CUSIP
{
return $this->cusip;
}
/**
* @return $this
*/
public function setCusip(?CUSIP $cusip): self
{
$this->cusip = $cusip;
return $this;
}
public function __construct()
{
$this->prices = new ArrayCollection();
}
}
class CUSIP {
private string $value;
public function __construct(string $value) {
if (strlen($value) < 9) {
throw new InvalidCUSIP();
}
$this->value = $value;
}
public function __toString()
{
return $this->value;
}
}
这就是我的树枝模板的样子:
{% for m in missing %}
<tr>
<td>{{ m.getSecurity.getSymbol }}</td>
<td>{{ m.getSecurity.getCusip }}</td>
<td>{{ m.getSecurity.getIsin }}</td>
<td>{{ m.getSecurity.getDescription }}</td>
<td>{{ m.getSecurity.getSecurityType }}</td>
<td>{{ m.getDate|date('d-M-y') }}</td>
<td><input type="text" name="price[{{ m.getId }}]" class="securityPrice"/></td>
</tr>
{% endfor %}
我得到的错误是:
Typed property App\Entity\Security::$cusip must be an instance of App\Entity\CUSIP or null, string used
谢谢,
所以我找到了自己问题的答案:我缺少注释以及字段定义。
当我将其更改为:
/**
* @ORM\Embedded(class = "CUSIP")
*/
private ?CUSIP $cusip = null;
它起作用了。谢谢!