Slide 1

Slide 1 text

APPLICATION CLI AVEC SILLY

Slide 2

Slide 2 text

PRÉSENTATION GÉNÉRALE

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

LA BASE : L’APPLICATION ➤ Le fonctionnement est super simple ➤ Silly\Application étends Symfony\Console\Application $app = new Silly\Application(); // do stuff $app->run();

Slide 5

Slide 5 text

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']);

Slide 6

Slide 6 text

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]

Slide 7

Slide 7 text

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!'); } });

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

PROJET #1 Tower-generator

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

TOWER GENERATOR 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();

Slide 12

Slide 12 text

TOWER GENERATOR run(); } }

Slide 13

Slide 13 text

PROJET #2 Mailer

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

CONCLUSION C’EST FAIT PAR UN LYONNAIS DONC C’EST COOL !

Slide 16

Slide 16 text

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”

Slide 17

Slide 17 text

POURQUOI C’EST PAS COOL ? ➤ Si vous trouvez le composant Console tout pourri, forcément c’est pas cool ➤ Sinon, slide précédent

Slide 18

Slide 18 text

MERCI ! twitter.com/pockystar