ecommit/doctrine-entities-generator-bundle

生成 Doctrine ORM 实体。

v2.0.0 2023-12-23 18:54 UTC

This package is auto-updated.

Last update: 2024-08-27 11:05:59 UTC


README

EcommitDoctrineEntitiesGeneratorBundle 包(适用于 Symfony)允许用户重新生成 Doctrine ORM 实体的 getter-setter 方法。

Tests

安装

使用 Composer 安装包:在您的项目目录中,执行以下命令

$ composer require ecommit/doctrine-entities-generator-bundle

在您的项目 config/bundles.php 文件中启用此包

return [
    //...
    Ecommit\DoctrineEntitiesGeneratorBundle\EcommitDoctrineEntitiesGeneratorBundle::class => ['dev' => true],
    //...
];

用法

将起始标签添加到您的实体中

    /*
     * Getters / Setters (auto-generated)
     */

警告:当包生成 getter-setter 方法时,此起始标签和 PHP 类结束标签之间的内容将被删除。getter-setter 方法将在这些标签之间生成。

例如

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Table(name: 'category')]
class Category
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer', name: 'category_id')]
    protected $categoryId;

    #[ORM\Column(type: 'string', length: 255)]
    protected $name;

    /*
     * Getters / Setters (auto-generated)
     */

    //Content after this block will be deleted when
    //the bundle generates the getters-setters methods.
    //Getters-setters methods will be generated here.
}

您可以根据需要更改起始标签和结束标签(默认为 PHP 类的末尾):请参阅“常见问题解答”部分。

在您的项目目录中,执行以下命令

$ php bin/console ecommit:doctrine:generate-entities {Classename}

例如

$ php bin/console ecommit:doctrine:generate-entities App/Entity/MyEntity

每个斜杠都将被反斜杠替换。

您可以使用 * 通配符(它会生成多个实体)。例如

$ php bin/console ecommit:doctrine:generate-entities App/Entity/*

只有当以下条件满足时,包才会为实体生成 getter-setter 方法:

  • PHP 类是 Doctrine ORM 实体;
  • 实体不是接口;
  • 实体不是特质;
  • 实体未使用 Ecommit\DoctrineEntitiesGeneratorBundle\Attribute\IgnoreGenerateEntity 属性。

只有当以下条件满足时,包才会为实体属性生成 getter-setter 方法:

  • 属性直接在实体中定义(而不是在继承类或特质中定义);
  • 属性不是公开的;
  • 方法(getter-setter)不存在(除非方法定义在起始和结束标签之间)。

常见问题解答

如何更改生成的代码?

代码生成时,将使用 @EcommitDoctrineEntitiesGenerator/Theme/base.php.twig Twig 模板。

您可以创建一个自定义模板(它扩展了基本模板)。

解决方案 1 - 覆盖包

请参阅 https://symfony.ac.cn/doc/current/bundles/override.html

解决方案 2 - 配置模板

在您的项目配置中,您可以配置包使用的主题。例如,您可以创建 config/packages/dev/ecommit_doctrine_entities_generator.yaml 文件

ecommit_doctrine_entities_generator:
    template: "your_template.php.twig"

解决方案 3 - 在实体中创建自定义模板

您可以使用 Ecommit\DoctrineEntitiesGeneratorBundle\Attribute\GenerateEntityTemplate 属性仅覆盖包用于实体的主题。

use Doctrine\ORM\Mapping as ORM;
use Ecommit\DoctrineEntitiesGeneratorBundle\Attribute\GenerateEntityTemplate;

#[ORM\Entity]
#[ORM\Table(name: 'category')]
#[GenerateEntityTemplate("your_template.php.twig")]
class Category
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer', name: 'category_id')]
    protected $categoryId;
    //...
}

如何更改起始和结束标签?

您可以根据前一个问题更改模板。

起始标签在 start_tag Twig 块中定义。

结束标签在 end_tag Twig 块中定义。

例如,您可以创建此主题

{% extends '@EcommitDoctrineEntitiesGenerator/Theme/base.php.twig' %}

{% block end_tag %}


    /*
     * End Getters / Setters (auto-generated)
     */
{% endblock %}

然后按如下方式使用

use Doctrine\ORM\Mapping as ORM;
use Ecommit\DoctrineEntitiesGeneratorBundle\Attribute\GenerateEntityTemplate;

#[ORM\Entity]
#[ORM\Table(name: 'category')]
#[GenerateEntityTemplate('your_template.php.twig')]
class Category
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer', name: 'category_id')]
    protected $categoryId;
    //...

    /*
     * Getters / Setters (auto-generated)
     */


    /*
     * End Getters / Setters (auto-generated)
     */
}

如何在实体中创建构造函数?

如果您的实体有一个 TOMANY 关联,包将在您的实体中创建构造函数。因此,不允许手动在实体中定义构造函数。

相反,您可以使用 Ecommit\DoctrineEntitiesGeneratorBundle\Entity\EntityInitializerInterface 接口及其 initializeEntity 方法。

use Doctrine\ORM\Mapping as ORM;
use Ecommit\DoctrineEntitiesGeneratorBundle\Entity\EntityInitializerInterface;

#[ORM\Entity]
#[ORM\Table(name: 'category')]
class Category implements EntityInitializerInterface
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer', name: 'category_id')]
    protected $categoryId;

    #[ORM\OneToMany(targetEntity: 'Ecommit\DoctrineEntitiesGeneratorBundle\Tests\App\Entity\Book', mappedBy: 'category')]
    protected $books;

    #[ORM\Column(type: 'datetime')]
    protected $createdAt;

    public function initializeEntity(): void
    {
        $this->createdAt = new \DateTime('now');
    }

    //...
}

这种方法生成的构造函数中将自动调用 initializeEntity 方法。

如果手动定义了实体中的构造函数,则会抛出 EntityInitializerInterfaceNotUsedException 异常

如果在使用 TOMANY 关联时在实体中手动定义了构造函数,则会抛出 Ecommit\DoctrineEntitiesGeneratorBundle\Exception\EntityInitializerInterfaceNotUsedException 异常。

请参阅前一个问题。

如果找不到标签,则会抛出 TagNotFoundException 异常

在您的实体中未找到起始和/或结束标签。

我如何忽略实体生成getter-setter方法?

并非所有实体都已被处理(请参阅“用法”部分以了解哪些类可以生成)。

您可以通过使用Ecommit\DoctrineEntitiesGeneratorBundle\Attribute\IgnoreGenerateEntity属性来忽略实体生成getter-setter方法。

use Doctrine\ORM\Mapping as ORM;
use Ecommit\DoctrineEntitiesGeneratorBundle\Attribute\IgnoreGenerateEntity;

#[ORM\Entity]
#[ORM\Table(name: 'category')]
#[IgnoreGenerateEntity]
class Category
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer', name: 'category_id')]
    protected $categoryId;
    //...
}

我如何忽略属性的getter-setter方法生成?

并非所有属性都已被处理(请参阅“用法”部分以了解哪些属性可以生成)。

为什么没有生成任何方法?

请参阅最后两个问题。

限制

该插件仅在以下条件下工作

  • 使用Doctrine属性(Doctrine注解不兼容)。
  • 每个PHP文件只能有一个实体(PHP类)。
  • 在每个实体(PHP类)内部
    • 每行只能有一个属性。
    • 每行只能有一个方法(但方法可以通过多行定义)。
  • EOL(行尾)= LF

许可协议

此插件可在MIT许可协议下使用。请参阅LICENSE文件中的完整许可协议。