ecommit / doctrine-entities-generator-bundle
生成 Doctrine ORM 实体。
Requires
- php: ^8.0
- ext-mbstring: *
- doctrine/collections: ^1.0|^2.0
- doctrine/doctrine-bundle: ^1.12.3|^2.4.5
- doctrine/inflector: ^1.4|^2.0
- doctrine/orm: ^2.7
- doctrine/persistence: ^1.1|^2.0|^3.0
- nikic/php-parser: ^4.10
- symfony/config: ^5.4|^6.4|^7.0
- symfony/console: ^5.4|^6.4|^7.0
- symfony/dependency-injection: ^5.4|^6.4|^7.0
- symfony/doctrine-bridge: ^5.4.3|^6.4|^7.0
- symfony/framework-bundle: ^5.4.5|^6.4|^7.0
- symfony/http-kernel: ^5.4|^6.4|^7.0
- symfony/property-info: ^5.4|^6.4|^7.0
- symfony/twig-bundle: ^5.4|^6.4|^7.0
- twig/twig: ^2.12.0|^3.0
Requires (Dev)
- doctrine/dbal: ^2.13.4|^3.1.4
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/extension-installer: ^1.2
- phpstan/phpstan: ^1.9
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.5
- symfony/filesystem: ^5.4|^6.4|^7.0
- symfony/finder: ^5.4|^6.4|^7.0
- symfony/yaml: ^5.4|^6.4|^7.0
README
EcommitDoctrineEntitiesGeneratorBundle 包(适用于 Symfony)允许用户重新生成 Doctrine ORM 实体的 getter-setter 方法。
安装
使用 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文件中的完整许可协议。