selami / console
Symfony Console application factory that autowires dependecies
2.3
2022-10-07 22:18 UTC
Requires
- php: ^8.0
- psr/container: ^1.1.2
- selami/stdlib: ^2.5
- symfony/console: ^v5.4.13
Requires (Dev)
- codeception/codeception: ^4.2.2
- codeception/codeception-progress-reporter: ^4.0.5
- codeception/module-asserts: ^2.0.1
- codeception/module-phpbrowser: ^2.0.3
- laminas/laminas-servicemanager: ^3.17.0
- malukenho/mcbumpface: ^1.1.5
- php-coveralls/php-coveralls: ^v2.5.3
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.7.1
README
Symfony Console application factory that autowires dependecies. Use any PSR-11 compatible DIC library.
Installation
composer require selami/console
Usage
Assume we use Zend ServiceManager as our PSR-11 compatible DIC.
1. Create your service
<?php declare(strict_types=1); namespace MyConsoleApplication\Service; class PrintService { public function formatMessage(string $greeting, string $message) : string { return 'Hello ' . $greeting . ' ' . $message; } }
2. Create a factory for your service
<?php declare(strict_types=1); namespace MyConsoleApplication\Factory; use Zend\ServiceManager\Factory\FactoryInterface; use Interop\Container\ContainerInterface; use MyConsoleApplication\Service\PrintService; class PrintServiceFactory implements FactoryInterface { public function __invoke(ContainerInterface $container, $requestedName, array $options = null) : PrintService { return new PrintService(); } }
3. Create your Symfony Command
<?php declare(strict_types=1); namespace MyConsoleApplication\Command; use MyConsoleApplication\Service\PrintService; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; class GreetingCommand extends Command { /** * @var PrintService */ private $printService; private $config; public function __construct(PrintService $printService, array $config, string $name = null) { $this->printService = $printService; $this->config = $config; parent::__construct($name); } protected function configure() : void { $this ->setName('command:greeting') ->setDescription('Prints "Hello {config.greeting} {name}') ->setDefinition([ new InputArgument('name', InputArgument::REQUIRED), ]); } protected function execute(InputInterface $input, OutputInterface $output) : void { $name = $input->getArgument('name'); $output->writeln($this->printService->formatMessage($this->config['greeting'], $name)); } }
5.Create your executable console application (i.e. ./bin/console)
#!/usr/bin/env php <?php declare(strict_types=1); require_once ('path/to/vendor/autoload.php'); use Selami\Console\ApplicationFactory; use Laminas\ServiceManager\ServiceManager; $container = new ServiceManager( [ 'factories' => [ MyConsoleApplication\Service\PrintService::class => MyConsoleApplication\Factory\PrintServiceFactory::class ] ] ); $container->setService( 'commands', [ MyConsoleApplication\Command\GreetingCommand::class ] ); $container->setService('config', ['greeting' => 'Dear']); $cli = ApplicationFactory::makeApplication($container); $cli->run();
6. Run your command on terminal
./bin/console command:greeting Kedibey
Prints: Hello Dear Kedibey