Skip navigation

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 | November 28, 2015 | No Comments | Système