Aller au contenu principal
Version: 0.6.3

Générer un fichier dynamique

Il est possible de créer une commande qui va générer un fichier et qui doit être dynamique en fonction de notre position dans le terminal au moment de l'exécution de la commande.

Exemple

Si je tape la commande suivante dans mon projet themes/my_theme:

php dobby my:command MyClass 

Je m'attend à ce que la commande génère un fichier avec le nom MyClass.php dans un dossier spécifique de mon thème my_theme.

Pour cela, il va falloir ajouter le trait FileGenerator :

app/Commands/MyCommand.php
use Elementum\Commands\Traits\FileGenerator;

class MyCommand extends Command
{
    use FileGenerator;

    // ...
}

Ce trait va nous permettre de récupérer des valeurs importantes pour générer le fichier correctement au sein de l'écosystème Elementum.

Ensuite, il va falloir un minimum d'informations à demander à l'utilisateur pour générer le fichier correctement. Dans la méthode configure il faudra ajouter au moins les arguments suivants :

app/Commands/MyCommand.php
protected function configure()
    {
        $this
            ->setDescription('Créer un nouveau contrôleur Elementum')
        // highlight-start
            ->addArgument('name', InputArgument::REQUIRED, 'Nom du contrôleur. Exemple : HomeController')
            ->addArgument('where', InputArgument::OPTIONAL, 'Où souhaitez-vous créer le fichier ? Exemple : themes/theme-name ou plugins/plugin-name')
        // highlight-end
        ;
    }

Dans la méthode execute il faudra récupérer les arguments et les utiliser dans la méthode useGenerator provenant du trait FileGenerator.

app/Commands/MyCommand.php
protected function execute(InputInterface $input, OutputInterface $output)
{
    // highlight-start
    $name = $input->getArgument('name');
    $where = $input->getArgument('where');
    // highlight-end

    // highlight-start
    [$path, $className, $namespace] = $this->useGenerator(
        $name,
        $where,
        $output,
        suffix: 'Controller' // Suffix du namespace, il génère également le dossier dans lequel le fichier sera généré
    );
    // highlight-end
}

Désormais, il nous manque plus que le contenu du fichier à générer. Pour cela, créez une méthode content pour retournez le contenu du fichier à générer comme ceci :

app/Commands/MyCommand.php
protected function content(array $args): string
{
    extract($args);
    return <<<PHP
<?php

namespace $namespace;

use Elementum\Abstract\Controller;
use Symfony\Component\HttpFoundation\Request;

class $className extends Controller
{
    public function index(Request \$request)
    {
        echo "Hello World - {$className}_controller";
    }
}
PHP;
}
astuce

Dans l'heredoc, il est possible d'utiliser les variables $namespace, $className et $path pour générer le contenu du fichier.

Il reste maintenant plus qu'à exécuter la méthode createFile pour générer le fichier.

app/Commands/MyCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
    // ...

    // highlight-start
    $content = $this->content([
        'namespace' => $namespace,
        'className' => $className,
    ]);
    // highlight-end

    // highlight-next-line
    $this->createFile($path, $content);
    $output->writeln("<info>Controller : $className</info>");
    $output->writeln("<comment>Création : $path</comment>");
    return Command::SUCCESS;
}