有没有可能自动在条令实体上创建附加属性,也许是通过注释



我有一个实体属性,并且基于该属性"name";我想构建额外的3个属性,如果我能通过注释、特征或扩展等来实现这一点,那将是非常棒的。

这是用户以多种语言输入的数据。

有许多实体,在这些实体中,可以有许多属性来转换

以下是一个示例实体

namespace AppEntity;
use AppRepositoryEntityRepository;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass=EntityRepository::class)
*/
class Entity
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="text")
*/
private $text;
}

我想";自动地";将其扩展为像这样编写一样的功能

namespace AppEntity;
use AppRepositoryEntityRepository;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass=EntityRepository::class)
*/
class Entity
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="text")
*/
private $text;
/**
* @ORMColumn(type="datetime")
*/
private $textUpdatedAt;
/**
* @ORMColumn(type="text", nullable=true)
*/
private $textEng;
/**
* @ORMColumn(type="datetime", nullable=true)
*/
private $textEngUpdatedAt;
}

";可翻译的";列可以是textstring(varchar(类型。属性更新时将自动设置时间戳。它用于";脏的";跟踪。

我以为Annotation会是我的答案,但当我尝试设置自定义注释时,我甚至无法自动传递propperty名称。我只会得到一个空类,如果我添加像条令文档中给出的代码,我就必须提供我想要的所有信息。

在您的情况下,我想您可以像在easyadmin中一样使用事件订阅服务器

或者当他们将其与条令一起使用时

用户只需设置文本,在Persist Event中可以添加类属性的其余部分

通过使用可嵌入的,我有了一个可重用的类;seporates the consern";翻译和时间戳,并自动创建额外的列。

通过创建像这样的可嵌入类

<?php
namespace AppModel;
use DoctrineORMMapping as ORM;
use GedmoMappingAnnotation as Gedmo;
/**
* @ORMEmbeddable
*/
class TranslatableText
{
/**
* @ORMColumn(type="text")
*/
private $text;
/**
* @ORMColumn(type="datetime")
* @GedmoTimestampable(on="change", field="text")
*/
private $textUpdatedAt;
/**
* @ORMColumn(type="text", nullable=true)
*/
private $textEng;
/**
* @ORMColumn(type="datetime", nullable=true)
* @GedmoTimestampable(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;
}
}

然后,我可以在实体中的任何属性上使用此注释

/**
* @ORMEmbedded(class="AppModelTranslatableText")
*/
private $newsMy;

在数据库中,这会导致以下表格列

news_my_text
news_my_text_updated_at
news_my_text_eng
news_my_text_eng_updated_at

时间戳由条令时间戳可扩展自动设置。访问数据也是直接的

$entity->getNewsMy()->getText(); // gives "native" text
$entity->getNewsMy()->getTextEng(); // gives translated english text

我有第二个可嵌入类;字符串";类型属性。

最新更新