laravel 初心者にとっては、laravel のカスタム Artisan コンソール コマンドについてあまり知らないかもしれません。次の記事では、laravel フレームワークでカスタム Artisan コンソール コマンドを作成する例を紹介します。
1. はじめに
Laravel は、非ブラウザーのビジネス ロジックを処理するための Artisan を介した強力なコンソール コマンドを提供します。 Laravel ですべての Artisan コマンドを表示するには、プロジェクトのルート ディレクトリで実行できます:
php artisan list
対応する出力は次のとおりです (部分的なスクリーンショット):
名前の一部は、すでによく知られています。マイグレーション make:migration と Migrate の実行 (モデルの作成、make:model、コントローラーの作成など) make:controller
特定のコマンドの具体的な使用法を確認したい場合、たとえば Artisan コマンド make:console の具体的な使用法を確認したい場合は、次のコマンドを使用できます:
php artisan help make:console
対応する出力は次のとおりです。 :
2. コマンドの作成
Artisan では、豊富なコンソール コマンドのセットを提供するだけでなく、make:console コマンドを使用して独自のコンソール コマンドを作成することもできます。上記では、help コマンドを使用して make:console の使用法を確認しました。このパスをたどって調べてみましょう。コマンドを作成して実行すると、必要なさまざまな結果が得られます。
まず、次のように Artisan コマンドを使用して、Hello LaravelAcademy を出力する最も単純なコマンドを作成します。
php artisan make:console HelloLaravelAcademy --command=laravel:academy
ここで、HelloLaravelAcademy はコマンド名、laravel:academy は、make:console と同様に、コンソールによって実行されるコマンドです。
実行が完了すると、HelloLaravelAcademy.php ファイルが app/Console/Commands ディレクトリに生成されます:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class HelloLaravelAcademy extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'laravel:academy'; /** * 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() { // } }
ここで、$signature はコンソールで実行されるコマンドの名前、$description はコマンドの説明、 handle メソッドは、コマンドが実行されるときに呼び出すメソッドです。
次に、次のようにハンドルメソッドを記述します:
public function handle() { echo "Hello LaravelAcademy\n"; }
さて、最も単純なコマンドが記述されました。それを実行してコンソールに「Hello Laravel Academy」と出力する方法は次のとおりです。
3. コマンドを実行します
コマンドを実行する前に、AppConsoleKernel の $commands 属性に登録する必要があります:
protected $commands = [ ... //其他命令类 \App\Console\Commands\HelloLaravelAcademy::class ];
次に、コンソールで次の Artisan コマンドを実行できます:
php artisan laravel:academy
印刷してください:
Hello LaravelAcademy
とても簡単ですね?
4. より多様な入力と出力
もちろん、上記は入力がなく、出力がハードコーディングされた最も単純なケースです。実際の環境では、より複雑な要件とより多様な入力と出力が存在します。以下で 1 つずつ説明します。
入力の定義
前述したように、$signature 属性を変更することで入力パラメータとオプションを定義できます。たとえば、ここでは上記の Hello の後の文字列を入力パラメータによって制御できるように調整します。以下のように:
protected $signature = 'laravel:academy {name}';
この定義は、name が必須パラメータであることを意味し、もちろん、より多くのカスタム パラメータ入力もサポートします:
{name?} //可选参数 {name=LaravelAcademy} //默认name值为LaravelAcademy
プログラムの堅牢性を強化するために、デフォルト値を持つように name を変更します:
protected $signature = 'laravel:academy {name=LaravelAcademy}';
場合によっては、コマンドを実行するときに、句読点を表示するかどうかなどのオプションを渡します (味気ないように思えますが、これはテストのためだけです)。その後、$signature 属性を次のように変更できます。コマンドを呼び出すときに --mark を渡すと、その値は true になります。それ以外の場合は、オプションの値が入力時にユーザーによって設定される場合、$signature は次のように定義できます:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark}';
このように、ユーザーはもちろん、オプションを渡すときに = を通じてオプションに値を割り当てることができます。オプションのデフォルト値を指定することもできます:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=}';
IlluminateConsoleCommandの引数メソッドを通じてパラメータ値を取得できます:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=!}';
$name = $this->argument('name');
$mark = $this->option('mark');
public function handle() { $name = $this->argument('name'); $mark = $this->option('mark'); $string = 'Hello '.$name; if($mark) $string .= $mark; echo $string."\n"; }
php artisan laravel:academy
Hello LaravelAcademy!
php artisan laravel:academy Laravel --mark=?
入力プロンプト
最初にハンドルメソッドを次のように変更して、ユーザーが入力パラメータを取得できるようにすることもできます。ターミナルの laravel:academy の対話型ページは次のとおりです:パスワードなどの機密情報を入力する場合は、ask メソッドの代わりに Secret を使用できます。
ユーザーの希望に応じて続行または中止を選択する場合もあります:
Hello Laravel?
除了让用户手动输入外,还可以使用anticipate方法实现自动完成功能:
public function handle() { $name = $this->anticipate('What is your name?', ['Laravel', 'Academy']); $this->info($name); }
当然还可以使用choice方法为用户提供选择避免手动输入,用户只需选择对应索引即可:
public function handle() { $name = $this->choice('What is your name?', ['Laravel', 'Academy']); $this->info($name); }
对应交互页面如下:
编写输出
关于输出字符串,上面我们简单使用了echo语句,其实Laravel提供了更为强大和多样化的方法:
public function handle() { $this->info("Successful!"); $this->error("Something Error!"); $this->question("What do you want to do?"); $this->comment("Just Comment it!"); }
执行php artisan laravel:academy对应输出如下:
表格
Artisan甚至可以输出表格:
public function handle() { $headers = ['Name', 'Email']; $users = \App\User::all(['name', 'email'])->toArray(); $this->table($headers, $users); }
执行php artisan laravel:academy对应输出为:
进度条
当然对于复杂耗时的命令,进度条是必不可少的,
public function handle() { $this->output->progressStart(10); for ($i = 0; $i < 10; $i++) { sleep(1); $this->output->progressAdvance(); } $this->output->progressFinish(); }
执行php artisan laravel:academy对应输出为:
5、从CLI之外调用Artisan
除了在控制台执行Artisan命令之外,还可以通过代码在别处调用Artisan命令,比如其它Artisan命令、控制器、路由或其他。
路由
在路由闭包中我们可以通过Artisan门面的call方法来调用本节创建的命令:
//在路由中调用Artisan命令 Route::get('testArtisan',function(){ $exitCode = Artisan::call('laravel:academy', [ 'name' => 'Laravel学院', '--mark' => '!' ]); });
其它Artisan命令
在一个Artisan命令中也可以调用另一个Artisan命令,还是通过call方法:
public function handle() { $this->call('inspire'); }
如果想要调用一个Artisan命令并阻止其所有输出,可以使用callSilent方法:
public function handle() { $this->callSilent('inspire'); }
除此之外,关于Artisan命令你还应该知道的是我们可以在创建的命令类的控制器或方法中注入任何依赖。这就意味着我们可以在命令类中使用注册到服务容器的所有类。
相关推荐:
Laravel框架内置的Broadcast功能如何实现与客户端实时通信
以上がLaravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。