ostark / yii2-artisan-bridge
为 Yii2 带来 Artisan 命令的便捷性和 Symfony 控制台的力量。
1.4.1
2024-04-19 07:26 UTC
Requires
- symfony/console: ^6.0
- symfony/process: ^3.0 || ^4.0 || ^5.0
- yiisoft/yii2: ^2.0
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>');