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
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']);
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!'); } });
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
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
$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();
* Class Status */ class Status { protected $output; public function __invoke(ConsoleOutputInterface $output) { $process = new Process( sprintf('tower-cli version’), // Un call API $output ); $process->run(); } }
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
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”