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 :
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 :
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.
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 :
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; }
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.
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; }