是否可以在学说实体上自动创建附加属性,可能是通过注释

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;
}

“可翻译”列可以是 textstring (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 用于“字符串”类型的属性。