Artisan は、laravel に付属するコマンドラインツールインターフェースの名前です。アプリケーション開発に役立つさまざまなコマンド ツールを提供します。 Artisan の基礎となるドライバーは、強力な Symfony コンソール コンポーネントです。 list コマンドを使用すると、使用可能なアーティザン コマンドを表示できます:
php artisan list
すべてのコマンドでヘルプ ドキュメントが提供されます。対応するコマンドの前にヘルプを使用すると、関連コマンドのオプションとパラメータを表示できます:
php artisan help migrate
Artisan に付属するコマンドに加えて、laravel では独自のコマンド ツールを定義することもできます。カスタマイズしたコマンド ツールを app/Console/Commands ディレクトリに保存できます。もちろん、保存する場所がcomposer.jsonの設定に基づいて自動的にロードできる限り、保存したい他のディレクトリに保存することもできます。
make:console Artisan コマンドを使用して、新しいコマンド ツールを生成できます。このコマンドは、開始に役立つサンプル コマンドを生成します。
php artisan make:console SendEmails
上記のコマンドは、A を生成します。 SendEmails クラスであり、app/Console/Commands/SendEmails.php に保存されます。コマンドを構築するときに、 --command パラメーターを使用してコマンド ツールの名前を設定できます。
php artisan make:console SendEmails --command=emails:send
コマンドが生成されたら、署名属性と説明属性を入力する必要があります。これらは list コマンドを使用すると画面に表示されます。
コマンドが実行されると、ハンドル メソッドがトリガーされます。このメソッドには、対応するコマンド ロジックを記述することができます。コマンドの例を見てみましょう。
コマンド クラスのコンストラクターで依存関係の注入を実行できることを知っておく必要があります。 laravelサービスコンテナは、コンストラクターでタイプヒントを使用するすべての依存関係を自動的に挿入します。コードをより再利用しやすくするには、コンソール コマンドを軽量にし、特定のタスクを完了するためにアプリケーション サービスに任せることをお勧めします。
<?phpnamespace App\Console\Commands;use App\User;use App\DripEmailer;use Illuminate\Console\Command;class SendEmails extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user}'; /** * The console command descritpion * * @var string */ protected $description = 'Send drip e-mails to a user'; /** * The drip e-mail service. * * @var DripEmailer */ protected $drip; /** * Create a new command instance. * * @param DripEmailer $drip * @return void */ public function __construct(DripEmailer $drip) { parent::__construct(); $this->drip = $drip; } /** * Execute the console command. * * @return mixed */ public function handle() { $this->drip->send(User::find($this->argument('user'))); }}
コマンド ライン ツールを作成するときは、通常、ユーザーが入力したパラメーターまたはオプションを通じて入力を収集します。 laravel を使用するとこれが非常に簡単になります。署名属性を使用して、コマンドで予期される入力名を定義できます。署名属性を使用すると、ルートに似た 1 行の表現的な構文を使用して、コマンド ラインで名前、パラメーター、およびオプションを定義できます。
ユーザー指定のパラメーターとオプションはすべて中括弧で囲まれています。次の例では、コマンド ライン ツールは必須パラメーターを定義しています: ユーザー:
/** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user}'
パラメーターをオプションにすることも、オプションのパラメーターのデフォルト値を定義することもできます:
// Optional argument...email:send {user?}// Optional argument with default value...email:send {user=foo}
パラメータと同様、オプションもユーザーからの入力の一種です。ただし、コマンドラインではプレフィックスとして -- を付けて指定します。次のようにシグネチャでオプションを定義できます:
/** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user} {--queeue}';
この例では、Artisan コマンドを使用するときに --queue を指定できます。 --queque が指定されている場合、このオプションの値は true になります。それ以外の場合、オプションの値は false になります:
php artisan emial:send 1 --queue
オプションの後に = 記号を追加することで、このオプションがユーザー入力を必要とすることを示すこともできます:
/** * The name and signature of the console command. * * @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=*}
説明を入力
オプションまたはパラメーターに説明情報を割り当てることもできます。説明とオプションを区切るには、: を使用する必要があります。またはパラメータ:
/** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user: The ID of the user} {--queue= : Whether the job should be queued}';
コマンド ツールが存在する場合、コマンド ラインで予期されるパラメータまたはオプションの値にアクセスする必要があるのは明らかです。引数メソッドとオプション メソッドを使用して取得できます:
/** * Execute the console command. * * @return mixed */ public function handle() { $userId = $this->argument('user'); }
パラメータなしで引数メソッドを呼び出すことで、すべてのパラメータの配列を取得できます:
$arguments = $this->argument();
オプションは非常に簡単ですパラメータと同様にオプション メソッドを通じて取得します。オプションはパラメーターと同様に使用できます。パラメーターのないオプション メソッドを呼び出すと、すべてのオプションの配列が返されます。
// Retrieve a specific option...$queueName = $this->option('queue');// Retrieve all options...$options = $this->option();
対応するパラメーターまたはオプションが取得されない場合は、null が返されます。
出力を表示することに加えて、コマンド ライン ツールの実行中にユーザーに追加の入力を求める必要がある場合もあります。 ask メソッドを使用してユーザーに入力を求めることができます。このメソッドはユーザーの入力を受け取り、入力内容を返します。
/** * Execute the console command. * * @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]')) { //}
给用户一个选择
anticipate 方法可以用来对可选的内容进行自动完成的提示。这里只是对用户有可能选择的内容进行自动完成提示,并非强制要求用户仅选择可选的内容:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
如果你需要给用户预置选项你可以使用 choice 方法。用户必须选中选项中的索引,用户选中相应的索引的答案的值将会被返回。你可以设置一个默认的索引值,这个索引值将在用户没有做出任何选择时返回:
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $default);
你可以使用 line,info,comment,question 和 error 方法发送输出到控制台。这些方法会使用相应的 ANSI 颜色来表明相应的目的。
你可以使用 info 方法来向用户显示一个信息消息。通常,这条消息在控制台中是一个绿色的文本:
/** * Execute the console command. * * @return mixed */ public function handle() { $this->info('Display this on the screen'); }
你可以使用 error 方法来显示一个错误消息。错误消息通常都是红色的:
$this->error('Something went wrong!');
你可以使用 line 方法来显示一个原生的控制台输出。line 方法并没有对消息设置任何的独特颜色信息:
$this->line('Display thie on the screen');
表格布局
你可以使用 table 方法来简单的对多行或多列的数据进行格式化布局。你只需要向方法中传递头部和行信息到方法中就可以了。宽度和高度将会自动的通过所给定的数据进行计算:
$headers = ['Name', 'Email']; $users = App\User::all(['name', 'email'])->toArray(); $this->table($headers, $users);
进度条
对于一些耗时的任务来说,有一个进度提示是非常有用的。如果使用输出对象,我们就可以开始,推进和停止进度条。你需要在你开始进度条之前定义步长。然后根据进行的每一步来推进进度条:
$user = App\User::all();$bar = $this->output->createProgressBar(count($users));foreach ($users as $user) { $this->performTask($user); $bar->advance();}$bar->finish();
你可以通过查看 Symfony Progress Bar component documentation 来获取更多的选项信息。
一旦你完成了命令行的编写,你还需要注册其在 Artisan 命令中可用。这些需要在 app/Console/Kernel.php 文件中完成。
在这个文件中,你会发现 commands 属性,它是一个命令行类的列表。当 Artisan 启动时,所有在这个列表中的命令都会通过服务容器解析到 Arisan:
protected $commands = [ Commands\SendEmails::class];
有时候你可能希望在控制台之外执行 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 标识并传递一个布尔值:
$exitCode = Artisan::call('migrate:refresh', [ '--force' => true,]);
有时候,你可能希望在命令行工具中调用另外一个已经存在的 Artisan 命令。你可以使用 call 方法来完成这些。call 方法接收命令的名称和一个包含所有参数和选项的数组:
/** * Execute the console command. * * @return mixed */ public function handle() { $this->call('email:send', [ 'user' => 1, '--queue' => 'default' ]); // }
如果你希望调用另外一个控制台命令而不希望它有任何的输出,你可以使用 callSilent 方法,callSilent 方法具有 call 方法相同的调用方式:
$this->callSilent('email:send', [ 'user' => 1, '--queue' => 'default']);