是否可以在学说实体上自动创建附加属性,可能是通过注释
Is it possible to automatically create additonal properties on a doctrine entity, maybe by annotation
我有一个实体 属性,基于那个 属性“名称”,我想构建另外 3 个属性,如果我能通过一个注释、特征或扩展等
这是用户以多种语言输入的数据。
有很多实体,在这些实体中,可以有很多属性需要翻译
这是一个示例实体
namespace App\Entity;
use App\Repository\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=EntityRepository::class)
*/
class Entity
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $text;
}
我想“自动”扩展它的功能,就好像它是这样写的一样
namespace App\Entity;
use App\Repository\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=EntityRepository::class)
*/
class Entity
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $text;
/**
* @ORM\Column(type="datetime")
*/
private $textUpdatedAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $textEng;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $textEngUpdatedAt;
}
“可翻译”列可以是 text
或 string
(varchar
) 类型。当 属性 更新时,时间戳将自动设置。它用于“脏”跟踪。
我以为注释会是我的答案,但当我尝试设置自定义注释时,我什至无法自动传入属性名称。我只会得到一个空的 class,如果我像教义文档那样添加代码,我将不得不提供我正在寻找的所有信息。
在您的情况下,我想您可以像在 easyadmin 中使用事件订阅者一样使用它 Here,
或者他们将其与学说一起使用 Here
用户可以只设置文本,在 Persist Event 中你可以添加其余的 class 属性
通过使用可嵌入的,我有一个可重复使用的 class,它“分离”翻译和时间戳的内容,并自动创建额外的列。
通过像这样创建一个可嵌入的 class
<?php
namespace App\Model;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Embeddable
*/
class TranslatableText
{
/**
* @ORM\Column(type="text")
*/
private $text;
/**
* @ORM\Column(type="datetime")
* @Gedmo\Timestampable(on="change", field="text")
*/
private $textUpdatedAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $textEng;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="change", field="textEng")
*/
private $textEngUpdatedAt;
public function getId(): ?int
{
return $this->id;
}
public function getText(): ?string
{
return $this->text;
}
public function setText(string $text): self
{
$this->text = $text;
return $this;
}
public function getTextUpdatedAt(): ?\DateTimeInterface
{
return $this->textUpdatedAt;
}
public function getTextEng(): ?string
{
return $this->textEng;
}
public function setTextEng(?string $textEng): self
{
$this->textEng = $textEng;
return $this;
}
public function getTextEngUpdatedAt(): ?\DateTimeInterface
{
return $this->textEngUpdatedAt;
}
}
然后我可以在实体中的任何 属性 上使用此注释
/**
* @ORM\Embedded(class="\App\Model\TranslatableText")
*/
private $newsMy;
在数据库中,这会产生以下 table 列
news_my_text
news_my_text_updated_at
news_my_text_eng
news_my_text_eng_updated_at
时间戳由 doctrine timestampable extension 自动设置。访问数据也很简单
$entity->getNewsMy()->getText(); // gives "native" text
$entity->getNewsMy()->getTextEng(); // gives translated english text
我还有第二个可嵌入 class 用于“字符串”类型的属性。
我有一个实体 属性,基于那个 属性“名称”,我想构建另外 3 个属性,如果我能通过一个注释、特征或扩展等
这是用户以多种语言输入的数据。
有很多实体,在这些实体中,可以有很多属性需要翻译
这是一个示例实体
namespace App\Entity;
use App\Repository\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=EntityRepository::class)
*/
class Entity
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $text;
}
我想“自动”扩展它的功能,就好像它是这样写的一样
namespace App\Entity;
use App\Repository\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=EntityRepository::class)
*/
class Entity
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="text")
*/
private $text;
/**
* @ORM\Column(type="datetime")
*/
private $textUpdatedAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $textEng;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $textEngUpdatedAt;
}
“可翻译”列可以是 text
或 string
(varchar
) 类型。当 属性 更新时,时间戳将自动设置。它用于“脏”跟踪。
我以为注释会是我的答案,但当我尝试设置自定义注释时,我什至无法自动传入属性名称。我只会得到一个空的 class,如果我像教义文档那样添加代码,我将不得不提供我正在寻找的所有信息。
在您的情况下,我想您可以像在 easyadmin 中使用事件订阅者一样使用它 Here,
或者他们将其与学说一起使用 Here
用户可以只设置文本,在 Persist Event 中你可以添加其余的 class 属性
通过使用可嵌入的,我有一个可重复使用的 class,它“分离”翻译和时间戳的内容,并自动创建额外的列。
通过像这样创建一个可嵌入的 class
<?php
namespace App\Model;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Embeddable
*/
class TranslatableText
{
/**
* @ORM\Column(type="text")
*/
private $text;
/**
* @ORM\Column(type="datetime")
* @Gedmo\Timestampable(on="change", field="text")
*/
private $textUpdatedAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $textEng;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="change", field="textEng")
*/
private $textEngUpdatedAt;
public function getId(): ?int
{
return $this->id;
}
public function getText(): ?string
{
return $this->text;
}
public function setText(string $text): self
{
$this->text = $text;
return $this;
}
public function getTextUpdatedAt(): ?\DateTimeInterface
{
return $this->textUpdatedAt;
}
public function getTextEng(): ?string
{
return $this->textEng;
}
public function setTextEng(?string $textEng): self
{
$this->textEng = $textEng;
return $this;
}
public function getTextEngUpdatedAt(): ?\DateTimeInterface
{
return $this->textEngUpdatedAt;
}
}
然后我可以在实体中的任何 属性 上使用此注释
/**
* @ORM\Embedded(class="\App\Model\TranslatableText")
*/
private $newsMy;
在数据库中,这会产生以下 table 列
news_my_text
news_my_text_updated_at
news_my_text_eng
news_my_text_eng_updated_at
时间戳由 doctrine timestampable extension 自动设置。访问数据也很简单
$entity->getNewsMy()->getText(); // gives "native" text
$entity->getNewsMy()->getTextEng(); // gives translated english text
我还有第二个可嵌入 class 用于“字符串”类型的属性。