Application CLI avec Silly

Application CLI avec Silly

Lightening Talk du sfPot Décembre 2015

12fad6dce4099a21ed70cf4409fe2271?s=128

Alexandre Balmes

December 22, 2015
Tweet

Transcript

  1. 3.

    PRÉSENTATION ➤ Micro-Framework basé sur le composant “symfony/console” ➤ Premier

    commit en Février 2015 ➤ Actuellement en version 1.1.1 ➤ http://mnapoli.fr/silly/ (du coup c’est lyonnais, vive les quenelles) $ composer require mnapoli/silly
  2. 4.

    LA BASE : L’APPLICATION ➤ Le fonctionnement est super simple

    ➤ Silly\Application étends Symfony\Console\Application $app = new Silly\Application(); // do stuff $app->run();
  3. 5.

    LA BASE : LA COMMANDE ➤ La définition d’une commande

    est toujours aussi simple ➤ Une commande est un callable // Closure $app->command('foo', function () { // ... }); // A function $app->command('foo', ‘someFunction'); // An object implementing __invoke() $app->command('foo', new InvokableObject()); // An object method $app->command('foo', [$object, 'method']); // A static class method $app->command('foo', ['MyClass', 'method']);
  4. 6.

    LES COMMANDES Nom greet / demo:greet Argument obligatoire greet name

    Argument optionnel greet [name] Tableau avec 0-n arguments greet [name]* Tableau avec 1-n arguments greet name* Option type “flag” (boolean) greet [--yell] Option obligatoire greet [--yell=] Tableau d’options 0-n greet [--iterations=]* Option avec raccourci greet [-y|--yell]
  5. 7.

    CONSOLE HELPERS ➤ La même chose qu’avec Symfony $app =

    new Silly\Application(); $app->command('greet', function ($input, $output) use ($app) { $helper = $app->getHelperSet()->get('question'); $question = new ConfirmationQuestion('Are you sure?', false); if ($helper->ask($input, $output, $question)) { $output->writeln('Hello!'); } });
  6. 8.

    DEPENDENCY INJECTION ➤ Silly est basé sur Container Interop :

    https://github.com/container-interop/ container-interop ➤ Donc c’est aussi super bien (il y a deux éditions avec Pimple et PHP-DI built-in) Acclimate: Adapters for Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2 Dependency injection and any container using ArrayAccess Aura.Di dcp-di Disco League/Container Mouf Njasm Container PHP-DI PimpleInterop Pimple3-ContainerInterop (using Pimple v3) SitePoint Container Ultra-Lite Container Unbox XStatic Zend\ServiceManager
  7. 10.

    TOWER GENERATOR ➤ Projet client avec Ansible + Tower ➤

    Tower ne possède pas de client PHP pour son API ➤ Mais Tower possède un client CLI pour son API ➤ Une premiere application (Zend Diactoros + Aura.router) récupère des hooks Bitbucket ➤ L’application “Hook” execute son traitement et délègue à l’application “Cli” ➤ L’application Cli interagit avec le CLI Tower
  8. 11.

    TOWER GENERATOR <?php require_once(__DIR__ . '/../vendor/autoload.php'); $builder = new DI\ContainerBuilder();

    $builder->addDefinitions(__DIR__ . ‘/../app/config/config.php'); // Credentials Tower $app = new Silly\Edition\PhpDi\Application('Tower-generator', '1.0', $builder->build()); $app->getContainer(); $app->command('status', new \Tasks\Status()); // Est-ce que le serveur réponds ? $app->command('pr-merged project', new \Tasks\JobLaunch()); // Playbook pour déployer $app->command('push project', new \Tasks\JobLaunch()); // Playbook pour déployer $app->command('instance-created project ip target [--repository]', new \Tasks\InstanceCreated()); // Nouveau projet $app->run();
  9. 12.

    TOWER GENERATOR <?php namespace Tasks; use Process\Process; use Symfony\Component\Console\Output\ConsoleOutputInterface; /**

    * Class Status */ class Status { protected $output; public function __invoke(ConsoleOutputInterface $output) { $process = new Process( sprintf('tower-cli version’), // Un call API $output ); $process->run(); } }
  10. 14.

    MAILER ➤ Projet client pour “envoyer des mails” ➤ Les

    applications existantes sont désastreuses à ce niveau et dans de multiples languages ➤ Il est impossible de s’intégrer à toutes les applications existantes ➤ Vive les grosses boites avec des multiples prestas Application principale RabbitMQ Application Mailer Application principale Application principale
  11. 16.

    POURQUOI C’EST COOL ? ➤ Parce que c’est super simple

    d’utilisation ➤ Parce que ça peux scaller du point de vue code (via les callables) ➤ Parce que c’est isolé et ça permet de répondre à un besoin unique ➤ Parce que la stack est “simple”
  12. 17.

    POURQUOI C’EST PAS COOL ? ➤ Si vous trouvez le

    composant Console tout pourri, forcément c’est pas cool ➤ Sinon, slide précédent