Symfony Console application factory that autowires dependecies. Use any PSR-11 compatible DIC library.
composer require selami/console
Assume we use Zend ServiceManager as our PSR-11 compatible DIC.
<?php
declare(strict_types=1);
namespace MyConsoleApplication\Service;
class PrintService
{
public function formatMessage(string $greeting, string $message) : string
{
return 'Hello ' . $greeting . ' ' . $message;
}
}
<?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();
}
}
<?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));
}
}
#!/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();
./bin/console command:greeting Kedibey
Prints: Hello Dear Kedibey