ostark/yii2-artisan-bridge

为 Yii2 带来 Artisan 命令的便捷性和 Symfony 控制台的力量。

1.4.1 2024-04-19 07:26 UTC

This package is auto-updated.

Last update: 2024-09-19 08:21:44 UTC


README

这个库将 Artisan 命令的便捷性和 Symfony 控制台的力量带到了 Yii2 和 Craft 5。

安装

需要此包

composer require ostark/yii2-artisan-bridge

配置 Craft 5 插件的动作

<?php namespace you\PluginName;

use Craft;
use craft\base\Plugin as BasePlugin;
use ostark\Yii2ArtisanBridge\ActionGroup;
use ostark\Yii2ArtisanBridge\Bridge;
use you\PluginName\actions\ActionOne;
use you\PluginName\actions\ActionTwo;

/**
 * Class Plugin
 */
class Plugin extends BasePlugin
{
    /**
     * Initialize Plugins
     */
    public function init()
    {
        parent::init();

        if (Craft::$app instanceof \yii\console\Application) {

            $group = (new ActionGroup('group-name', 'What this group is about.'))
                ->setActions([
                    'action1'  => ActionOne::class,
                    'action2'  => ActionTwo::class,
                ])
                ->setDefaultAction('action1')
                ->setOptions([
                    'one' => 'option-one',
                    'two' => 'option-two',
                    'option-without-alias'
                ]);
            
            Bridge::registerGroup($group);
        }
    }
}

编写你的动作(命令)

您为每个动作写一个类。实际的指令位于 run() 方法中,类似于 Symfony 中的 execute() 或 Laravel 中的 handle()。命令参数映射到 run() 方法的参数。

选项和选项别名在 Commands::register($prefix, $actions, $options) 中注册。要访问选项,它必须在动作类中声明为公共属性。

<?php namespace you\PluginName\actions;

use Craft;
use ostark\Yii2ArtisanBridge\base\Action as BaseAction;
use yii\console\ExitCode;

class ActionOne extends BaseAction {

    public $optionOne = 'default-value';
    
    /**
      * Ask some question
      *
      * @param string $name
      * @return bool
      */
    public function run($name) {
    
        $this->title("Hello {$name}, 'option-one' is '{$this->optionOne}'");
        
        $answer = $this->choice("What's your favorite animal?", ['Dog','Cat','Elephant']);
        
        if ($answer === 'Elephant') {
            $this->successBlock("'$answer' is correct.");
            return ExitCode::OK;
        } else {
            $this->errorBlock("'$answer' is the wrong.");
            return ExitCode::UNSPECIFIED_ERROR;
        }
    
    }
}   

Artisan 辅助方法

提示输入

$name = $this->ask('What is your name?', $default = null)`
$name = $this->anticipate('What is your name?', ['Taylor', 'Fabien', 'Brad', 'Brandon']);
if ($this->confirm('Do you wish to continue?')) {
    // continue
}

编写输出

$this->info('Display this on the screen');
$this->error('Something went wrong!');
$headers = ['Name', 'Email'];
$rows    = [['First name', 'First email'], ['Second name', 'Second email']];

$this->table($headers, $rows);

Symfony 区块样式

$this->title('Title style block');
$this->section('Section style block');
$this->listing(['One','Two','Three'];

$this->successBlock('Yeah!');
$this->errorBlock('Oh no!');

// Custom blocks
$this->block($messages, $type = null, $style = null, $prefix = ' ', $padding = true, $escape = true);

Symfony 进度条

$items = range(1,10);

$bar = $this->output->createProgressBar(count($items));

// Custom format
$bar->setFormat('%message%' . PHP_EOL . '%bar% %percent:3s% %' . PHP_EOL . 'time:  %elapsed:6s%/%estimated:-6s%' . PHP_EOL.PHP_EOL);
$bar->setBarCharacter('<info>'.$bar->getBarCharacter().'</info>');
$bar->setBarWidth(80);

foreach ($items as $i) {
    sleep(1);
    $bar->advance();
    $bar->setMessage("My bar, some progress... $i");
}

$bar->finish();

自定义格式化器

注册自定义 OutputFormatterStyle

// in your init()
\yii\base\Event::on(
    Commands::class,
    Commands::EVENT_BEFORE_ACTION,
    function (ActionEvent $event) {
        $style = new OutputFormatterStyle('white', 'cyan');
        $event->action->output->getFormatter()->setStyle('ocean', $style);
    }
);

应用样式

$this->title('Title in <ocean>blue</ocean>');