popov/maker-generator-bundle

此包为 Symfony 4 及以上版本恢复生成包代码的支持

dev-master 2020-09-30 11:08 UTC

This package is auto-updated.

Last update: 2024-08-29 05:31:09 UTC


README

此包为 Symfony 4 及以上版本恢复生成包代码的可能性。它还支持由 Symfony Flex 创建的新无包目录结构。

MakerGeneratorBundle 通过提供所有 make:* 命令的新 --namespace 选项以及用于生成代码骨架(如包或基于 Doctrine 2 模式的 CRUD 操作)的新交互式和直观命令,增强了 MakerBundle。大部分代码都采用了旧的知名 SensioGeneratorBundle。这些代码生成器提供的样板代码将为您节省大量时间和工作量。

安装

步骤 1:下载包

打开命令行控制台,进入您的项目目录,并执行以下命令以下载此包的最新稳定版本

$ composer require popov/maker-generator-bundle

步骤 2:启用包

然后,通过将其添加到项目的 config/bundles.php 文件中注册的包列表来启用包,以在 dev 环境中使用

// config/bundles.php
return [
    // ...
    Popov\MakerGeneratorBundle\PopovMakerGeneratorBundle::class => ['dev' => true],
];

可用命令列表

此包提供的所有命令都可以在交互式或非交互式模式下运行。交互式模式会询问您一些问题,以配置实际生成代码的命令参数。

阅读以下文章以了解如何使用新命令

生成新的包骨架

基本用法

$ php bin/console make:bundle --namespace=App/BlogBundle

详细概述

生成新的操作

基本用法 @todo

详细概述

其他嵌入式命令

从官方文档:此包在 make: 命名空间下提供了一些命令。执行此命令以列出所有命令

$ php bin/console list make


 make:command            Creates a new console command class
 make:controller         Creates a new controller class
 make:entity             Creates a new Doctrine entity class

 [...]

 make:validator          Creates a new validator and constraint class
 make:voter              Creates a new security voter class

命令名称一目了然,但其中一些包括可选参数和选项。使用 --help 选项查看它们

 php bin/console make:controller --help

使用策略

默认策略

默认情况下,Symfony 4 及以上版本在 App 命名空间下提供无包结构。因此,您的所有代码都只有 App 命名空间。如果您想更改命名空间,请阅读下一章。

通过最少的努力,在标准的 Symfony 配置中,您只需向命令添加 --namespace 选项即可获取格式良好的代码。

请注意,此方法不会为您创建真正的包,而只是创建类似包的目录结构。这有一些好处,因为您不需要创建额外的包配置文件,除非您想将其发布到 Packages 等。

无论如何,您可以在任何时刻添加所需的配置文件,并通过从标准的 Symfony 方法复制粘贴和重新构建文件来获取真正的包。

运行下一个命令后,新的实体将在 src/ 目录中生成,命名空间为 App\BlogBundle\Entity\Post

$ php bin/console make:entity Post --namespace=App/BlogBundle
DI 配置

将以下配置添加到 config/services.yaml。这告诉 Symfony 使 src/App/BlogBundle 中的类可用于作为服务使用。它为每个类创建一个服务,其 ID 为完全限定的类名。

注意:您必须为每个新命名空间添加此配置。如果您使用基于包的结构,则将其添加到包配置中。

# config/services.yaml
services:
    # ...

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\BlogBundle\:
        resource: '../src/App/BlogBundle/*'
        exclude: '../src/App/BlogBundle/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\BlogBundle\Controller\:
        resource: '../src/App/BlogBundle/Controller'
        tags: ['controller.service_arguments']

包策略

包结构允许将相关的代码组织在某个目录下。您不需要滚动查看几十个甚至几千个文件来查找所需的内容。这种方法使代码更易于阅读和理解。

这种方法和之前的方法一样有效,但是在使用 make:* 命令创建任何类之前,你必须生成包结构

$ php bin/console make:bundle --namespace=App/BlogBundle

修改默认命名空间

在某些情况下,你可能不想使用默认的 App 命名空间,而是想使用你自己的命名空间或你公司的命名空间,那么你必须将以下文件中的 App\Kernel 命名空间更改为其他名称

  • src/Kernel.php
  • public/index.php
  • bin/console

覆盖骨架模板

所有生成器都使用模板骨架来生成文件。默认情况下,命令使用在 Resources/skeleton/ 目录下提供的模板。

你可以在以下位置创建相同的目录和文件结构来自定义骨架模板(从高到低优先级显示)

  • <BUNDLE_PATH>/Resources/MakerGeneratorBundle/skeleton/
  • resources/MakerGeneratorBundle/skeleton/

<BUNDLE_PATH> 的值指的是你正在为其构建动作或 CRUD 后端的包的基础路径。

例如,如果你想覆盖 CRUD 生成器的 edit 模板,在 resources/MakerGeneratorBundle/skeleton/ 下创建一个 crud/views/edit.html.twig.twig 文件。

在覆盖模板时,查看默认模板以了解更多关于可用的模板、它们的路径以及它们可以访问的变量。

你不必复制/粘贴原始模板来创建自己的模板,也可以扩展它,并仅覆盖相关的部分

{# resources/MakerGeneratorBundle/skeleton/crud/actions/create.php.twig #}

{# notice the "skeleton" prefix here -- more about it below #}
{% extends "skeleton/crud/actions/create.php.twig" %}

{% block phpdoc_header %}
   {{ parent() }}
   *
   * This is going to be inserted after the phpdoc title
   * but before the annotations.
{% endblock phpdoc_header %}

默认骨架中的复杂模板被拆分为 Twig 块,以便易于继承,并避免复制/粘贴大量代码。

在某些情况下,骨架中的模板包含其他模板,例如 crud/views/edit.html.twig.twig 模板

{{ include('crud/views/others/record_actions.html.twig.twig') }}

如果你为这个模板定义了自定义模板,它将代替默认模板。但是,你可以通过在路径前加上 skeleton/ 来显式包含原始骨架模板,就像我们上面做的那样

{{ include('skeleton/crud/views/others/record_actions.html.twig.twig') }}

你可以在官方的 Twig 文档 中了解更多关于这个有趣的“技巧”。