Artisan は、開発プロセス中に多くの便利なコマンドを提供する Laravel 独自のコマンドライン インターフェイスの名前です。強力な SymfonyConsole コンポーネントによって駆動されます。使用可能なアーティザン コマンドをすべて表示するには、list コマンドを使用します。
php artisan list
各コマンドについて、help コマンドを使用して、コマンドの説明、コマンドのパラメーターとオプションを表示できます。ヘルプ インターフェイスを表示するには、コマンドの前にヘルプを追加します。
php artisan help migrate
Artisan が提供するコマンドに加えて、次のコマンドも実行できます。独自のコマンドを構築します。カスタム コマンドは app/Console/Commands ディレクトリに保存できます。もちろん、composer.json によってコマンドが自動的に読み込まれる限り、保存場所を自分で選択することもできます。
新しいコマンドを作成するには、Artisan コマンド make:console を使用できます。
php artisan make:console SendEmails
上記のコマンドは、作成時にクラス app/Console/Commands/SendEmails.php を生成します。コマンド 場合、--command オプションを使用して端末コマンド名を割り当てることができます (端末からコマンドを呼び出すときに使用します):
php artisan make:console SendEmails --command=emails:send
コマンドが実行された後生成された後、クラスのプロパティの署名と説明を入力する必要があります。これら 2 つのプロパティは、リスト表示コマンドを呼び出すときに使用されます。
コマンドの実行時にハンドル メソッドが呼び出されます。最初にコマンドの例を見てみましょう。
コマンド コントローラーのコンストラクターに依存関係を挿入できます。Laravel サービス プロバイダーは、すべての依存関係タイプのヒントをコンストラクターに自動的に挿入します。コードの再利用性を高めるには、コードを軽量にし、タスクをアプリケーション サービスに延期することをお勧めします。
<?phpnamespace App\Console\Commands;use App\User;use App\DripEmailer;use Illuminate\Console\Command;use Illuminate\Foundation\Inspiring;class Inspire extends Command{ /** * 控制台命令名称 * * @var string */ protected $signature = 'email:send {user}'; /** * 控制台命令描述 * * @var string */ protected $description = 'Send drip e-mails to a user'; /** * The drip e-mail service. * * @var DripEmailer */ protected $drip; /** * 创建新的命令实例 * * @param DripEmailer $drip * @return void */ public function __construct(DripEmailer $drip) { parent::__construct(); $this->drip = $drip; } /** * 执行控制台命令 * * @return mixed */ public function handle() { $this->drip->send(User::find($this->argument('user'))); }}
コンソールコマンドを作成する場合、通常、ユーザー入力はパラメーターとオプションを通じて収集されます。Laravel では、この操作が非常に便利です。コマンドの署名属性を使用して、期待されるユーザー入力を定義します。署名属性を使用すると、洗練されたルーター スタイルの構文を通じてコマンド名、パラメーター、およびオプションを定義できます。ユーザー指定のパラメーターとオプションはすべて中括弧で囲まれています。次の例で定義されているコマンドでは、ユーザーが必須パラメーターを入力する必要があります。
/** * 控制台命令名称 * * @var string */protected $signature = 'email:send {user}';
パラメーターをオプションにして、デフォルトを定義することもできます。オプションのパラメーター値:
// 选项参数...email:send {user?}// 带默认值的选项参数...email:send {user=foo}
オプションもパラメーターと同様にユーザー入力の形式です。違いは、オプションの前に 2 つのダッシュ (-) があることです。次のように定義できます。 :
/** * 控制台命令名称 * * @var string */protected $signature = 'email:send {user} {--queue}';
この例では、Artisan コマンドを呼び出すときに --queue スイッチが指定されています。 --queue スイッチが渡された場合、その値は true になり、それ以外の場合は、その値は false になります:
php artisan email:send 1 --queue
= を介してオプション値がユーザーによって割り当てられるように指定することもできます:
/** * 控制台命令名称 * * @var string */protected $signature = 'email:send {user} {--queue=}';
この場合、ユーザーは次のような値を渡すことができます:
php artisan email:send 1 --queue=default
オプションにデフォルト値を割り当てることもできます:
email:send {user} {--queue=default}
コマンド オプションに省略表現を割り当てたい場合は、オプションの前に区切り文字 | を指定して、省略されたオプション名と完全なオプション名を区切ることができます:
email:send {user} {--Q|queue}
でパラメータとオプションを定義したい場合入力配列を指定するには、文字 * を使用できます:
email:send {user*}email:send {user} {--id=*}
入力の説明
入力パラメーターとオプションをコロンで区切ることで、説明を割り当てることができます:
/** * 控制台命令名称 * * @var string */protected $signature = 'email:send {user : The ID of the user} {--queue= : Whether the job should be queued}';
コマンドが実行されると、当然のことながら、コマンドによって取得されたパラメーターとオプションの値にアクセスする必要があります。これは、引数メソッドとオプション メソッドを使用して実現できます:
パラメータの値を取得するには、引数メソッドを使用します:
/** * 执行控制台命令 * * @return mixed */public function handle(){ $userId = $this->argument('user');}
すべてのパラメータ値を取得する必要がある場合配列の形式で、パラメータ引数なしで使用します。
$arguments = $this->argument();
オプション値の取得は、パラメータ値と同じくらい簡単です。すべてのオプション値を取得したい場合は、オプション メソッドを使用します。パラメーターなしでオプション メソッドを呼び出すこともできます。
// 获取指定选项...$queueName = $this->option('queue');// 获取所有选项...$options = $this->option();
パラメーターまたはオプションが存在しない場合は、null を返します。
出力を表示するだけでなく、コマンドの実行中にユーザーに入力を求めることもできます。 ask メソッドは、ユーザーに特定の質問を表示し、入力を受け取り、ユーザー入力をコマンドに返します。
/** * 执行控制台命令 * * @return mixed */public function handle(){ $name = $this->ask('What is your name?');}
シークレット メソッドは ask メソッドに似ていますが、ユーザー入力は非表示です。このメソッドは、ユーザーにパスワードなどの機密情報を要求する場合に便利です。
$password = $this->secret('What is the password?');
ユーザーに確認させる必要がある場合は、
この情報を取得するには、confirm メソッドを使用できます。デフォルトでは、このメソッドは false を返し、ユーザーが y を入力すると true を返します。
if ($this->confirm('Do you wish to continue? [y|N]')) { //}
ユーザーに選択肢を与えます
可能なオプションのオートコンプリートを提供するために使用され、ユーザーは選択肢に関係なく回答を選択できます:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
ユーザーに事前定義された選択肢を提供する必要がある場合は、choice メソッドを使用できます。ユーザーは回答のインデックスを選択しますが、返されるのは回答の値です。ユーザーが何も選択しなかった場合のデフォルトの戻り値を設定できます:
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], false);
要将输出发送到控制台,使用line, info, comment, question和 error方法,每个方法都会使用相应的ANSI颜色以作标识。
要显示一条信息消息给用户,使用 info方法。通常,在终端显示为绿色:
/** * 执行控制台命令 * * @return mixed */public function handle(){ $this->info('Display this on the screen');}
要显示一条错误消息,使用 error方法。错误消息文本通常是红色:
$this->error('Something went wrong!');
如果你想要显示原生输出,可以使用line方法,该方法输出的字符不带颜色:
$this->line('Display this on the screen');
表格布局
table方法使输出多行/列格式的数据变得简单,只需要将头和行传递给该方法,宽度和高度将基于给定数据自动计算:
$headers = ['Name', 'Email'];$users = App\User::all(['name', 'email'])->toArray();$this->table($headers, $users);
进度条
对需要较长时间运行的任务,显示进度指示器很有用,使用该输出对象,我们可以开始、前进以及停止该进度条。在开始进度时你必须定义步数,然后每走一步进度条前进一格:
$users = App\User::all();$this->output->progressStart(count($users));foreach ($users as $user) { $this->performTask($user); $this->output->progressAdvance();}$this->output->progressFinish();
想要了解更多,查看 Symfony进度条组件文档。
命令编写完成后,需要注册到Artisan才可以使用,这可以在 app/Console/Kernel.php文件中完成。
在该文件中,你会在 commands属性中看到一个命令列表,要注册你的命令,只需将其加到该列表中即可。当Artisan启动的时候,该属性中列出的命令将会被服务容器解析被注册到Artisan:
protected $commands = [ 'App\Console\Commands\SendEmails'];
有时候你可能希望在CLI之外执行Artisan命令,比如,你可能希望在路由或控制器中触发Artisan命令,你可以使用Artisan门面上的 call方法来完成这个。 call方法接收被执行的命令名称作为第一个参数,命令参数数组作为第二个参数,退出代码被返回:
Route::get('/foo', function () { $exitCode = Artisan::call('email:send', [ 'user' => 1, '--queue' => 'default' ]);});
使用Artisan上的 queue方法,你甚至可以将Artisan命令放到队列中,这样它们就可以通过后台的队列工作者来处理:
Route::get('/foo', function () { Artisan::queue('email:send', [ 'user' => 1, '--queue' => 'default' ]);});
如果你需要指定不接收字符串的选项值,例如 migrate:refresh命令上的 --force标识,可以传递布尔值 true或 false:
$exitCode = Artisan::call('migrate:refresh', [ '--force' => true,]);
有时候你希望从一个已存在的Artisan命令中调用其它命令。你可以通过使用 call方法开实现这一目的。 call方法接收命令名称和数组形式的命令参数:
/** * 执行控制台命令 * * @return mixed */public function handle(){ $this->call('email:send', [ 'user' => 1, '--queue' => 'default' ]);}
如果你想要调用其它控制台命令并阻止其所有输出,可以使用 callSilent方法。 callSilent方法和 call方法用法一致:
$this->callSilent('email:send', [ 'user' => 1, '--queue' => 'default']);