bash : exécuter des commandes php via symfony
bash : exécution de commandes php via symfony
Le scripting shell, ce n’est plus à prouver, est une chose merveilleuse et permet de facilité la vie des beaucoups d’entre nous.
Cependant, pour les habitués de PHP – et/ou de symfony – il peut être utile de mettre à profit leur connaissance de ce langage (le PHP) plutôt que ce ce familiariser avec le scripting shell à proprement parler.
Présenter comme cela, on dirait une solution de contournement. Peut-être… quoiqu’il en soit, le scripting bash via PHP est une réalité et présentent un certain nombre d’avantages notamment concernant la documentation des commandes.
Installation de Symfony
Installation de composer dans un premier temps.
user@debian~#: curl -sS https://getcomposer.org/installer | php
sortie
#!/usr/bin/env php All settings correct for using Composer Downloading... Composer successfully installed to: /root/sym-script/composer.phar Use it: php composer.phar
Ensuite Symfony à proprement parler.
user@debian~#: php composer.phar require symfony/symfony
sortie
Using version ^2.7 for symfony/symfony ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) - Installing psr/log (1.0.0) Downloading: 100% - Installing twig/twig (v1.23.1) Downloading: 100% - Installing doctrine/lexer (v1.0.1) Downloading: 100% - Installing doctrine/annotations (v1.2.7) Downloading: 100% - Installing doctrine/collections (v1.3.0) Downloading: 100% - Installing doctrine/cache (v1.5.1) Downloading: 100% - Installing doctrine/inflector (v1.1.0) Downloading: 100% - Installing doctrine/common (v2.5.1) Downloading: 100% - Installing symfony/symfony (v2.7.7) Downloading: 100% Writing lock file Generating autoload files
Structure d’un projet
La structure du dossier doit être la suivante.
nom-du-namespace/
├── src/
│ ├── application.php
│ └── Console
│ └── Command
│ └── fichier-de-commande.php
├── vendor/
├── application.php
├── composer.json
├── composer.lock
└── composer.phar
Lorsque Symfony est installé, seul le dossier vendor/ et les fichier composer.* sont présent.
Il faut donc créer l’architecture présenté précédemment.
user@debian~$: mkdir --parent src/Console/Command
C’est dans le dossier src/Console/Command/ que seront stocké les script.
Autre chose, le fichier application.php, il fonctionne avec l’auto-loader, voici son contenu.
#!/usr/bin/env php <?php // application.php require __DIR__.'/vendor/autoload.php'; use nom-du-namespace\Console\Command\nom-du-fichier-de-la-classe; use Symfony\Component\Console\Application; $application = new Application(); $application->add(new nom-de-la-classe()); $application->run();
Enfin, le fichier composer.json, c’est lui qui v permettre de charger les fichiers placé dans src/Console/Command/. Voici son contenu.
{
"require": {
"symfony/symfony": "^2.7"
},
"autoload": {
"psr-4": {
"nom-du-namespace\\": "src/"
}
}
}
Une fois ce fichier modifier, il faut mettre à jour composer.
user@debian~$: php composer.phar update
Création des premières commandes
Exemple de fichier contenant des commandes (liste le contenu d’un dossier).
<?php namespace nom-du-namespace\Console\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class nom-de-la-classe extends Command { protected function configure() { $this ->setName('list:folder') ->setDescription('list folder') ->addArgument( 'folder', InputArgument::OPTIONAL, 'Which do you want to list?' ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $folder = $input->getArgument('folder'); if ($folder) { $text = scandir($folder); } else { $text = 'No folder name has been specified'; } $output->writeln($text); } }
Lancement de la commmande
user@debian~$: php application.php list:folder /home
by Nicolas SHINEY | November 28, 2015 | No Comments | Système