【问题标题】:Override symfony make:entity to load custom columns覆盖 symfony make:entity 以加载自定义列
【发布时间】:2023-01-19 04:34:18
【问题描述】:

对于我要处理的当前项目,我需要使用 make:entity 命令创建许多实体。

每次创建新实体时,都需要定义以下列

  • id_owner
  • sys_date_created
  • sys_date_modified
  • 创建日期
  • 修改日期
  • id_group
  • id_user

问题是每次创建新实体时我都必须输入以下每个字段。

如果可以覆盖 make:entity 函数但无济于事,我一直在查看 symfony 和 doctrine 文档。

我想要的是,每次我们生成一个新实体时,都会自动生成上述字段。

例如,仅由 symfony 自动生成的列 id。

如果有人有任何工作代码或链接可以共享,那就太好了。 提前致谢

【问题讨论】:

  • 用这些字段创建一个基础抽象实体,然后让其他人扩展它?
  • 您可以分叉制造商包,然后修改实体模板 (Entity.tpl.php) 文件。听起来可能有点矫枉过正,尤其是如果您以前没有做过这种事情,但这是一项有用的技能。我只看过 make 包几次,但似乎应该可以覆盖模板文件所在的位置。在这种情况下,提供您自己的模板会相当容易。但我没有看到任何当前的能力。

标签: php symfony orm doctrine-orm doctrine


【解决方案1】:

我查看了 maker bundle 的 Generator 类,发现有一个合理的解决方案来覆盖正在使用的模板。

生成器的代码具有:

       $templatePath = $templateName; // doctrine/Entity.tpl.php
        if (!file_exists($templatePath)) {
            $templatePath = __DIR__.'/Resources/skeleton/'.$templateName;

            if (!file_exists($templatePath)) {
                throw new Exception(sprintf('Cannot find template "%s"', $templateName));
            }
        }

因此,在查找模板文件时,生成器首先在当前目录中查找,然后在 maker 包的 Resources/skeleton 目录中查找。因此,在您的应用程序主目录中创建一个名为 doctrine 的目录,复制默认模板文件并进行编辑以适合。例如

# project_dir/doctrine/Entity.tpl.php
# Copy this from vendor/symfony/maker-bundle/Resources/skeleton/Entity.tpl.php
<?= "<?php
" ?>

namespace <?= $namespace ?>;

<?= $use_statements; ?>

#[ORMEntity(repositoryClass: <?= $repository_class_name ?>::class)]
<?php if ($should_escape_table_name): ?>#[ORMTable(name: '`<?= $table_name ?>`')]
<?php endif ?>
<?php if ($api_resource): ?>
#[ApiResource]
<?php endif ?>
<?php if ($broadcast): ?>
#[Broadcast]
<?php endif ?>
class <?= $class_name."
" ?>
{
    #[ORMId]
    #[ORMGeneratedValue]
    #[ORMColumn]
    private ?int $id = null;

    public function getId(): ?int
    {
        return $this->id;
    }
    // Add your custom stuff here
    public function getWhatever() : void {}
}

之后 make:entity 命令将选择您自己的自定义模板。这不是一个完美的解决方案。如果制造商捆绑包更新了模板,那么您将需要更新您的模板。如果你能告诉生成器去哪里看,但它确实有效,那就太好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2019-01-31
    • 2016-11-05
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多