定制 circli/console 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

circli/console

最新稳定版本:2.3.0

Composer 安装命令:

composer require circli/console

包简介

wrapper around symfony console to better support containers

README 文档

README

Latest Version Software License Build Status Coverage Status

I created this package to have a more lightweight initialization of symfony console applications. It's a bit annoying if a class dose auto connect to something remote, and it needs todo that when you list the commands or run something not connected to the remote service. So I split the definition and command into 2 parts one for the definition and one for the command. And the command is not initialized until it's needed.

Installation

composer require circli/console

Usage

Definition

The definition object handles everything related to how the command is called. And must extend \Circli\Console\Definition.

Command

The command can be anything callable and must return an integer.

So any class you want to use as a command need to implement __invoke(InputInterface $input, OutputInterface $output): int.

Most basic definition

class ExampleCommandDefinition extends \Circli\Console\Definition
{
    protected function configure(): void
    {
        $this->setName('example:command');
        $this->setCommand(function($input, $output) {
            return 0;
        });
    }
}

$application = new Application();
$application->addDefinition(new ExampleCommandDefinition());

$application->run();

Using custom input

You can transform input into custom input types to have better type hinting and control over what is passed into a command

class ExampleInput extends \Circli\Console\AbstractInput
{
    public function getFrom(): \DateTimeInterface
    {
        $rawDate = $this->getArgument('from') ?: 'now';
        
        return new \DateTimeImmutable($rawDate);
    }
}

class ExampleCommandDefinition extends \Circli\Console\Definition
{
    protected function configure(): void
    {
        $this->setName('example:command');
        $this->addArgument('from', InputArgument::REQUIRED);
        $this->setCommand(function(ExampleInput $input, $output) {
            $from = $input->getFrom();
            return 0;
        });
    }
    
    public function transformInput(InputInterface $input, OutputInterface $output): InputInterface
    {
        return new ExampleInput();
    }

}

Using psr container

This is a basic implementation to get lazy initialization to work.

If you pass in the container command resolver it will try resolving the command when it's needed.

You can write your own resolver logic if you don't want to pass in the container like this

use Circli\Console\Application;
use Circli\Console\ContainerCommandResolver;
use Circli\Console\Definition;

$application = new Application(new ContainerCommandResolver($psr11container));
$application->addDefinition(new class extends Definition {
    protected function configure(): void
    {
        $this->setName('example:command');
        $this->setCommand('keyInContainer');
    }
});
$application->run();

Using with regular Symfony console

use Symfony\Component\Console\Application;
use Circli\Console\Command;

$application = new Application();
$application->add(new \Circli\Console\Command(new CmdDefinition()));
$application->run();

License

The MIT License (MIT). Please see License File for more information.

统计信息

  • 总下载量: 12.67k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 3
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2020-07-21