Raccourcis : Contenu - rubriques - sous rubriques
EN FR

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