如何为Laravel 5.3创建自定义控制台命令(工匠)

本文概述

  • 创建并注册命令
  • 命令结构
  • 列印文字
  • 命令输入:参数和选项
  • 例子
  • 从控制器或路径执行命令
Laravel有一个名为Artisan的命令行界面。该界面为开发人员提供了许多有用的命令, 以加快开发过程。
此外, 你可能想用自己的命令扩展artisan, 以创建和自动执行Laravel项目的独特任务。命令通常存储在app / Console / Commands目录中, 但是, 只要Composer可以加载命令, 你就可以自由选择自己的存储位置。
在本文中, 你将学习如何在Laravel 5.3中轻松为工匠创建自定义命令。
创建并注册命令 Laravel帮助你简化了一切, 它已经集成了make:console NewClassName命令来加快你的开发过程。该命令将类的名称作为第一个参数, 并且可以选择使用command选项直接指定命令的名称, 而无需修改类。
要创建名为quiz:start的新控制台命令, 请使用类名称QuizStart在控制台中执行以下命令:
php artisan make:command QuizStart --command=quiz:start

注意:如果不想使用控制台, 请在” 命令结构” 中复制示例类, 然后根据需要更改文件和类的名称。还要记住, 在早期版本的Laravel < 5.2中, 你需要使用make:console而不是make:command。
这应该在/ app / console / commands目录中使用App \ Console \ Commands命名空间创建QuizStart类。
最后, 我们的命令未注册, 因此我们需要将其添加到$ commands数组中的/app/console/Kernel.php文件中(提供类路径和名称):
protected $commands = [// Commands\Inspire::class, 'App\Console\Commands\QuizStart'];

使用php artisan cache:clear清除缓存并尝试使用先前给定的名称执行命令:
php artisan quiz:start

不出所料, 该命令什么都不做, 现在你只需要学习如何处理该命令即可。
命令结构 要自定义命令和描述的名称, 请直接在类中更改名称, 命令的所有逻辑都将存储在handle函数中。
< ?php#/App/Console/Commands/QuizStart.phpnamespace App\Console\Commands; use Illuminate\Console\Command; class QuizStart extends Command{/*** The name and signature of the console command.** @var string*/protected $signature = 'quiz:start'; /*** The console command description.** @var string*/protected $description = 'Command description'; /*** Create a new command instance.** @return void*/public function __construct(){parent::__construct(); }/*** Execute the console command.** @return mixed*/public function handle(){//}}

列印文字 要将输出发送到控制台, 可以在以下方法之间进行选择:行, 信息, 注释, 问题和错误方法。这些方法都将使用适当的ANSI颜色作为其用途。
/** * Execute the console command. * * @return mixed */public function handle(){$this-> line("Some text"); $this-> info("Hey, watch this !"); $this-> comment("Just a comment passing by"); $this-> question("Why did you do that?"); $this-> error("Ops, that should not happen."); }

命令输入:参数和选项 在命令中包含参数和选项
如果未设置期望功能的参数或选项, 则即使使用参数执行命令, 命令也将无法工作。
在Laravel中, 我们直接在字符串中定义参数和选项的是签名属性(命令名称)(与旧版本的Laravel不同):
/** * The name and signature of the console command. * * @var string */protected $signature = 'quiz:start {user} {age} {--difficulty=} {--istest=}';

参数以简单的{argumentName}语法和选项为{– optionName =}在我们的命令中注册。所以现在我们不需要在类中创建get选项和get arguments方法。
它的语法很容易理解, 基本上所有这些都是在命令中使用参数和选项的方式(如果你需要更多详细信息, 请阅读文档):
  • 参数:quiz:start {参数}。
  • 可选参数(请注意参数名称旁边的问号):quiz:start {argument?}。
  • 具有默认值的参数:quiz:start {argument = defaultValue}。
  • 布尔选项:quiz:start – myOption。
  • 具有值的选项:quiz:start – myOption =。
  • 具有值和默认值的选项:quiz:start – myOption = 12。
检索参数和选项值
如果你的命令需要一些值才能工作(参数), 则需要访问这些值才能在命令中使用它们。要完成此任务, 可以使用arguments和option方法:
/** * Execute the console command. * * @return mixed */public function handle(){// Get single Parameters$username = $this-> argument('user'); $difficulty = $this-> option('difficulty'); // Get all$arguments = $this-> arguments(); $options = $this-> options(); // Stop execution and ask a question $answer = $this-> ask('What is your name?'); // Ask for sensitive information$password = $this-> secret('What is the password?'); // Choices$name = $this-> choice('What is your name?', ['Taylor', 'Dayle'], $default); // Confirmationif ($this-> confirm('Is '.$name.' correct, do you wish to continue? [y|N]')) {//}}

例子 以下功能将在控制台中创建一个交互式测验, 你需要回答所有这些测验。填写完测验后, 它将显示你键入的答案。
/** * Execute the console command. * * @return mixed */public function handle(){$difficulty =$this-> option('difficulty'); if(!$difficulty){$difficulty = 'easy'; }$this-> line('Welcome '.$this-> argument('user').", starting test in difficulty : ". $difficulty); $questions = ['easy' => ['How old are you ?', "What is the name of your mother?", 'Do you have 3 parents ?', 'Do you like Javascript?', 'Do you know what is a JS promise?'], 'hard' => ['Why the sky is blue?', "Can a kangaroo jump higher than a house?", 'Do you think i am a bad father?', 'why the dinosaurs disappeared?', "why don't whales have gills?"]]; $questionsToAsk = $questions[$difficulty]; $answers = []; foreach($questionsToAsk as $question){$answer = $this-> ask($question); array_push($answers, $answer); }$this-> info("Thanks for do the quiz in the console, your answers : "); for($i = 0; $i < = (count($questionsToAsk) -1 ); $i++){$this-> line(($i + 1).') '. $answers[$i]); }}

如何为Laravel 5.3创建自定义控制台命令(工匠)

文章图片
从控制器或路径执行命令 显然, 当我们使用ask方法时, 它不起作用, 但是对于其他方法, 你可以使用以下命令执行命令:
$exitCode = Artisan::call('quiz:start', ['user' => 'Carlos', '--difficulty' => 'hard']);

【如何为Laravel 5.3创建自定义控制台命令(工匠)】如果你需要有关工匠的更多信息, 可以在此处阅读文档。玩得开心 !

    推荐阅读