Chapitre: Écrire des scripts pour la ligne de commande
« Services web | ^ Fondamentaux | Définir des traitements communs à plusieurs actions » |
− Table des matières
Jelix fournit un mécanisme pour fournir vos scripts en ligne de commande réalisée avec le composant Symfony Console.
Jelix 1.7 supporte aussi son propre système de script pour console, basé sur le
composant jControllerCmdLine
et des points d'entrée spécifique à la ligne
de commande, mais ce système est obsolète même si il est encore utilisable. Pour
savoir comment l'utiliser, lisez le manuel de Jelix 1.6.
Ce chapitre va vous apprendre à déclarer et à utiliser des scripts réalisés avec Symfony Console dans une application Jelix.
Principes ¶
Les commandes fournies par vos modules, sont appelables par le script console.php
de votre application. Ce script connaît toutes les commandes de votre application
en exécutant le script commands.php
de chaque module, si il est présent.
Ce script commands.php
est chargé de déclarer les commandes présentes
dans le module, et chaque commande est implémentée par une classe héritant
de \Jelix\Scripts\ModuleCommandAbstract
(qui elle même hérite de
Symfony\Component\Console\Command\Command
).
Création d'une commande ¶
Créer une classe de commande dans votre module, par exemple dans un repertoire
Commands
. Si vous avez déclaré un namespace pour votre module, comme par
exemple \SoftCie\MyModule\
dans module.xml :
<psr4 name="\SoftCie\MyModule" dir="./"/>
Alors vous pourriez nommer votre classe \SoftCie\MyModule\Commands\Foo
,
qui hérite de \Jelix\Scripts\ModuleCommandAbstract
, dans le fichier
Commands/Foo.php
:
namespace \SoftCie\MyModule\Commands;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Foo extends \Jelix\Scripts\ModuleCommandAbstract {
protected function configure()
{
$this
->setName('mymodule:foo')
->setDescription('this is a script')
->setHelp('')
->addArgument(...)
->addOption(...)
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
}
}
Dans la méthode configure()
, vous déclarez le nom de la commande (celui qu'il
faudra taper après console.php
), ainsi que les arguments et options
qu'accepte votre commande.
La méthode execute()
contient le code de votre commande.
Pour en savoir plus sur les méthodes et propriétés disponibles dans une classe de commande Symfony, lisez le manuel de Symfony Console.
Sachez que lorsque les méthodes configure()
et execute()
sont lancés,
vous êtes dans l'environnement Jelix du point d'entrée principal de votre
application, c'est à dire que le application.init.php a été lancé, jApp contient
tout ce qu'il faut comme dans un contrôleur, et que vous pouvez appeler
n'importe quel composant Jelix.
Déclarer la commande ¶
Une fois la classe de la commande faite, il faut la faire connaître à
console.php
. Pour cela il faut avoir à la racine du module (donc au même
niveau que module.xml), un script commands.php
. Ce script a accès à un objet
\Symfony\Component\Console\Application
dans une variable $application
,
ce qui vous permet de déclarer la commande comme ceci :
use \SoftCie\MyModule\Commands;
$application->add(new Commands\Foo());
Lancer la commande ¶
Il faut utiliser le script console.php, lui indiquer le nom de la commande que vous voulez lancer et les éventuelles options et paramètres.
php console.php mymodule:foo
Pour avoir la liste des commandes disponibles, utilisez la commande list
ou
ne donnez aucun argument :
php console.php list
# ou
php console.php
Et pour obtenir l'aide de la commande, la commande help
suivit du nom de la
commande ou alors utiliser l'option -h
:
php console.php help mymodule:foo
# ou
php console.php mymodule:foo -h