تولید کد با یک دستور

برای تولید کد از یک دستور، سه گام وجود دارد:

  1. ایجاد یک قالب Twig برای کدی که می‌خواهید تولید کنید.
  2. ایجاد و ثبت یک سرویس Generator سفارشی برای پردازش قالب Twig.
  3. قراردادن سرویس Generator سفارشی درون دستور

ایجاد یک قالب Twig برای کد تولید شده

تمام قالب‌های Twig باید درون یک دایرکتوری templates از زیرمجموعه افزونه شما قرار بگیرند. برای نمونه:

templates/module/info.yml.twig

name: {{ module }}
type: {{ type }}
description: {{ description }}
core: {{ core }}
package: {{ package }}
{% if dependencies %}
dependencies:
{% for dependency in dependencies %}
  - {{ dependency }}
{% endfor %}
{% endif %}

ایجاد یک سرویس Generator سفارشی

برای ایجاد یک سرویس Generator سفارشی، ابتدا کلاسی ایجاد کنید که از Drupal\Console\Core\Generator\Generator تبعیت می‌کند. برای نمونه:

src/Generator/ModuleGenerator

namespace Drupal\your_extension\Generator;

use Drupal\Console\Core\Generator\Generator;

class ModuleGenerator extends Generator
{
  ...
}

با استفاده از متد renderFile()، که از کلاس Generator به ارث رسیده است، قالب Twig خود را پردازش کنید.

public function generate($module, $machineName, $output_dir, $description, $core, $package, $dependencies) {

  $parameters = [
    'module' => $module,
    'core' => $core,
    'description' => $description,
    'package' => $package,
    'dependencies' => $dependencies,
  ];

  $this->renderFile(
    'module/info.yml.twig',
    $output_dir.'/'.$machineName.'.info.yml',
    $parameters
  );

}

در نهایت، کلاس Generator خود را به عنوان یک سرویس سفارشی درون console.services.yml ثبت کنید.

services:
  your_extension.module_generator:
    class: Drupal\your_extension\Generator\ModuleGenerator
    tags:
      - { name: drupal.generator }

اطمینان یابید که برچسب drupal.generator وارد شده باشد تا پردازشگر Twig به صورت صحیح راه‌اندازی گردد.

قراردادن سرویس Generator سفارشی درون دستور

درون console.services.yml، سرویس Generator سفارشی را به عنوان یک آرگومان برای دستور خود قرار دهید.

services:
  your_extension.generate_module:
    class: Drupal\your_extension\Command\Generate\ModuleCommand
    arguments: ['@your_extension.module_generator']
    tags:
       - { name: drupal.command }

و Generator سفارشی را درون پارامتر constructor از کلاس Command قرار دهید.

use Drupal\your_extension\Generator\ModuleGenerator;

class ModuleCommand extends Command
{
  /**
   * ModuleCommand constructor.
   *
   * @param \Drupal\your_extension\Generator\ModuleGenerator $generator
   */
  public function __construct(ModuleGenerator $generator) {
    $this->generator = $generator;
    parent::__construct();
  }
   
  ...
}

اکنون می‌توانید Generator را از متد execute() دستور خود فراخوانی کنید تا فایل‌های مورد نیاز پردازش گردند.

protected function execute(InputInterface $input, OutputInterface $output) {
  
  ...
  
  $this->generator->generate(
    $module,
    $machineName,
    $modulePath,
    $description,
    $core,
    $package,
    $dependencies
  );
  
}