Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

不言
リリース: 2018-07-31 11:39:48
オリジナル
3124 人が閲覧しました

laravel 初心者にとっては、laravel のカスタム Artisan コンソール コマンドについてあまり知らないかもしれません。次の記事では、laravel フレームワークでカスタム Artisan コンソール コマンドを作成する例を紹介します。

1. はじめに

Laravel は、非ブラウザーのビジネス ロジックを処理するための Artisan を介した強力なコンソール コマンドを提供します。 Laravel ですべての Artisan コマンドを表示するには、プロジェクトのルート ディレクトリで実行できます:

php artisan list
ログイン後にコピー

対応する出力は次のとおりです (部分的なスクリーンショット):

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

名前の一部は、すでによく知られています。マイグレーション make:migration と Migrate の実行 (モデルの作成、make:model、コントローラーの作成など) make:controller

特定のコマンドの具体的な使用法を確認したい場合、たとえば Artisan コマンド make:console の具体的な使用法を確認したい場合は、次のコマンドを使用できます:

php artisan help make:console
ログイン後にコピー

対応する出力は次のとおりです。 :

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

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 = &#39;laravel:academy&#39;;
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;Command description.&#39;;
    /**
     * 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 = &#39;laravel:academy {name}&#39;;
ログイン後にコピー

この定義は、name が必須パラメータであることを意味し、もちろん、より多くのカスタム パラメータ入力もサポートします:

{name?} //可选参数
{name=LaravelAcademy} //默认name值为LaravelAcademy
ログイン後にコピー

プログラムの堅牢性を強化するために、デフォルト値を持つように name を変更します:

protected $signature = &#39;laravel:academy {name=LaravelAcademy}&#39;;
ログイン後にコピー

場合によっては、コマンドを実行するときに、句読点を表示するかどうかなどのオプションを渡します (味気ないように思えますが、これはテストのためだけです)。その後、$signature 属性を次のように変更できます。コマンドを呼び出すときに --mark を渡すと、その値は true になります。それ以外の場合は、オプションの値が入力時にユーザーによって設定される場合、$signature は次のように定義できます:

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark}&#39;;
ログイン後にコピー

このように、ユーザーはもちろん、オプションを渡すときに = を通じてオプションに値を割り当てることができます。オプションのデフォルト値を指定することもできます:

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark=}&#39;;
ログイン後にコピー

入力を定義した後。入力パラメータとオプション、それらに対応する値を取得するにはどうすればよいでしょうか? Laravel は対応するメソッドを提供します。

IlluminateConsoleCommandの引数メソッドを通じてパラメータ値を取得できます:

protected $signature = &#39;laravel:academy {name=LaravelAcademy} {--mark=!}&#39;;
ログイン後にコピー

パラメータなしで引数メソッドが呼び出された場合、すべてのパラメータ値の配列が返されます。

IlluminateConsoleCommand の option メソッドを通じてオプション値を取得できます:

$name = $this->argument(&#39;name&#39;);
ログイン後にコピー

同様に、パラメーターなしで option メソッドを呼び出すと、すべてのオプション値の配列が返されます。

このようにして、HelloLaravelAcademy のハンドル メソッドを次のように変更できます:

$mark = $this->option(&#39;mark&#39;);
ログイン後にコピー

このようにして、コンソールに次の Artisan コマンドを入力します:

public function handle()
{
    $name = $this->argument(&#39;name&#39;);
    $mark = $this->option(&#39;mark&#39;);
    $string = 'Hello '.$name;
    if($mark)
        $string .= $mark;
    echo $string."\n";
}
ログイン後にコピー

対応する出力は次のとおりです:

php artisan laravel:academy
ログイン後にコピー
ログイン後にコピー

次に、次の Artisan を実行します。コマンド:

Hello LaravelAcademy!
ログイン後にコピー

対応する出力は次のとおりです:

php artisan laravel:academy Laravel --mark=?
ログイン後にコピー

入力プロンプト

最初にハンドルメソッドを次のように変更して、ユーザーが入力パラメータを取得できるようにすることもできます。ターミナルの laravel:academy の対話型ページは次のとおりです:

パスワードなどの機密情報を入力する場合は、ask メソッドの代わりに Secret を使用できます。

ユーザーの希望に応じて続行または中止を選択する場合もあります:

Hello Laravel?
ログイン後にコピー

対応する出力は次のとおりです: Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

除了让用户手动输入外,还可以使用anticipate方法实现自动完成功能:

public function handle()
{
    $name = $this->anticipate(&#39;What is your name?&#39;, [&#39;Laravel&#39;, &#39;Academy&#39;]);
    $this->info($name);
}
ログイン後にコピー

当然还可以使用choice方法为用户提供选择避免手动输入,用户只需选择对应索引即可:

public function handle()
{
    $name = $this->choice(&#39;What is your name?&#39;, [&#39;Laravel&#39;, &#39;Academy&#39;]);
    $this->info($name);
}
ログイン後にコピー

对应交互页面如下:

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

编写输出

关于输出字符串,上面我们简单使用了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对应输出如下:

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

表格

Artisan甚至可以输出表格:

public function handle()
{
    $headers = [&#39;Name&#39;, &#39;Email&#39;];
    $users = \App\User::all([&#39;name&#39;, &#39;email&#39;])->toArray();
    $this->table($headers, $users);
}
ログイン後にコピー

执行php artisan laravel:academy对应输出为:

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

进度条

当然对于复杂耗时的命令,进度条是必不可少的,

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对应输出为:

Laravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法

5、从CLI之外调用Artisan

除了在控制台执行Artisan命令之外,还可以通过代码在别处调用Artisan命令,比如其它Artisan命令、控制器、路由或其他。

路由

在路由闭包中我们可以通过Artisan门面的call方法来调用本节创建的命令:

//在路由中调用Artisan命令
Route::get(&#39;testArtisan&#39;,function(){
    $exitCode = Artisan::call(&#39;laravel:academy&#39;, [
        &#39;name&#39; => &#39;Laravel学院&#39;, &#39;--mark&#39; => &#39;!&#39;
    ]);
});
ログイン後にコピー

其它Artisan命令

在一个Artisan命令中也可以调用另一个Artisan命令,还是通过call方法:

public function handle()
{
    $this->call(&#39;inspire&#39;);
}
ログイン後にコピー

如果想要调用一个Artisan命令并阻止其所有输出,可以使用callSilent方法:

public function handle()
{
    $this->callSilent(&#39;inspire&#39;);
}
ログイン後にコピー

除此之外,关于Artisan命令你还应该知道的是我们可以在创建的命令类的控制器或方法中注入任何依赖。这就意味着我们可以在命令类中使用注册到服务容器的所有类。

相关推荐:

laravel框架的启动过程分析

Laravel框架内置的Broadcast功能如何实现与客户端实时通信

以上がLaravel 5.1 フレームワークでカスタム Artisan コンソール コマンドを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート