アーティザンコマンドライン


#はじめに

    Tinker コマンド (REPL)
  • #コマンドの生成
  • コマンド構造
    • 終了コマンド
    • 入力の期待値の定義
    パラメータ
  • オプション
  • #対話型入力
    • 出力の書き込み
    • コマンドの登録
    • プログラムによるコマンドの実行
  • 他のコマンドからコマンドを呼び出す
    はじめに
Artisan は Laravel 独自のコマンドライン インターフェイスであり、Laravel アプリケーションの構築に役立つ多くのコマンドを提供します。使用可能なすべてのアーティザン コマンドのリストを表示するには、

list コマンドを使用します。

php artisan list

各コマンドには、コマンドで使用可能なパラメータとオプションを表示および要約するヘルプ インターフェイスが含まれています。コマンドのヘルプ インターフェイスを表示するには、コマンドの前に
help
を追加するだけです:

php artisan help migrate

Tinker command (REPL )

すべての Laravel アプリケーションには、

PsySH パッケージに基づく REPL である Tinker が含まれています。 Tinker を使用すると、コマンドラインから Laravel アプリケーション全体を操作できます。 Eloquent ORM、タスク、イベントなどが含まれます。 Artisan コマンド tinker

を実行して Tinker 環境に入ります:
php artisan tinker

vendor:publish

コマンドを使用して Tinker 構成ファイルを公開できます:

php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"

コマンド ホワイトリスト

Tinker はホワイトリストを使用して、シェル内でどの Artisan コマンドの実行を許可するかを決定します。デフォルトでは、clear-compileddownenvinspiremerge、# # を実行できます。 #optimize および up コマンド。ホワイトリスト コマンドをさらに追加したい場合は、tinker.php 構成ファイルの commands 配列にコマンドを追加できます:

'commands' => [ 
   // App\Console\Commands\ExampleCommand::class,
   ],

ブラックリスト エイリアス

通常、Tinker はニーズに基づいて Tinker 内のクラスにエイリアスを自動的に追加します。ただし、クラスによってはエイリアスを追加したくない場合もあります。これを行うには、

tinker.php 構成ファイルの dont_alias 配列でこれらのクラスを列挙します。

#コマンドの作成

Artisan が提供するコマンドに加えて、独自のカスタム コマンドを作成することもできます。通常、コマンドは app/Console/Commands

ディレクトリに保存されますが、Composer でコマンドをロードできる限り、独自の保存場所を自由に選択できます。

コマンドの生成

新しいコマンドを作成するには、Artisan コマンドを使用しますmake:command# # #。このコマンドは、

app/Console/Commands
ディレクトリに新しいコマンド クラスを作成します。このディレクトリは、Artisan コマンド
make:command

を初めて実行するときに作成されるため、アプリケーションに存在しなくても心配する必要はありません。生成されたコマンドには、すべてのコマンドにデフォルトで存在するプロパティとメソッドが含まれます。

'dont_alias' => [ 
   App\User::class,
 ],

コマンド構造

コマンドの実行 最後に、php 職人リスト を入力するときに使用法を明確に理解できるように、最初に

signature
属性と
description

属性を入力する必要があります。コマンドの実行時に

handle

メソッドが呼び出され、このメソッドにコマンド ロジックを配置できます。 {ヒント} コードを再利用しやすくするには、コンソール コードを軽量に保ち、完了をアプリケーション サービスに延期することが最善です。次の例では、電子メールを送信するタスクを完了するためにサービス クラスを挿入します。 簡単な例を見てみましょう。必要な依存関係は handle メソッドに注入できます。 Laravel サービス コンテナは、コンストラクターの型制約を持つすべての依存関係を自動的に挿入します。

php artisan make:command SendEmails

クロージャ コマンド

クロージャ ベースのコマンドは、コンソール コマンドを定義する代わりにクラスを使用する方法を提供します。同様に、クロージャ ルーティングはコントローラの代替であり、クロージャ コマンドはコマンド クラスの代替と考えることができます。 app/Console/Kernel.php ファイルの commands メソッドで、Laravel は routes/console.php ファイルをロードします:

<?php
    namespace 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 description.
     *
     * @var string
     */   
    protected $description = 'Send drip e-mails to a user';    
     /**
     * Create a new command instance.
     *
     * @return void
     */  
   public function __construct()    {    
      parent::__construct();   
     }    
     /**
     * Execute the console command.
     *
     * @param  \App\DripEmailer  $drip
     * @return mixed
     */  
   public function handle(DripEmailer $drip)  
     {     
        $drip->send(User::find($this->argument('user')));  
      }
   }

このファイルは HTTP ルートを定義しませんが、アプリケーションへのコンソールベースのエントリ ポイント (ルート) を定義します。このファイルでは、Artisan::command メソッドを使用してすべてのクロージャ ルートを定義できます。 command このメソッドは 2 つのパラメータを受け入れます: コマンド名 とコマンド パラメータとオプションを受け入れるクロージャ:

/**
 * Register the Closure based commands for the application.
 *
 * @return void
 */
 protected function commands(){ 
    require base_path('routes/console.php');
 }

クロージャは基礎となるコマンド インスタンスをバインドします。完全なコマンド クラスで使用できるメソッドにアクセスできます。

タイプヒントによる依存関係

コマンド クロージャは、コマンド パラメーターとオプションを受け取るだけでなく、タイプ ヒントを使用してサービス コンテナーからの他の依存関係を解決することもできます。

Artisan::command('build {project}', function ($project) { 
   $this->info("Building {$project}!");
});

クロージャ コマンドの説明

クロージャ コマンドを定義するときは、describe メソッドを使用してコマンドに説明を追加する必要があります。この説明は、phpArtisanList または phpArtisanhelp コマンドを実行すると表示されます:

use App\User;
use App\DripEmailer;Artisan::command('email:send {user}', function (DripEmailer $drip, $user) { 
   $drip->send(User::find($user));
});

##期待される出力を定義する

コンソール コマンドを作成する場合、通常、ユーザー入力はパラメーターとオプションを通じて収集されます。 Laravel では、

signature 属性を通じてユーザーが入力するものを簡単に定義できます。 signature 単一の可読性の高い、ルートに似た構文を使用して、コマンド名、パラメーター、およびオプションを定義できます。

パラメータ

ユーザー指定のパラメータとオプションはすべて中括弧で囲まれています。次の例では、このコマンドは

required パラメータを定義します: user:

Artisan::command('build {project}', function ($project) {
    $this->info("Building {$project}!");
 })->describe('Build the project');

オプションのパラメータを作成し、パラメータのデフォルト値を定義することもできます。

/**
 * The name and signature of the console command.
 *
 * @var string
 */
 protected $signature = 'email:send {user}';

オプション

オプションは、パラメーターと同様、ユーザー入力の別の形式です。コマンドラインでオプションを指定する場合、オプションの先頭には 2 つのハイフン (

-- ) が付けられます。オプションには、値を受け取るものと値を受け取らないものの 2 種類があります。値を受け入れないオプションは、ブール値の「スイッチ」に似ています。このタイプのオプションの例を見てみましょう。

// 可选参数...
email:send {user?}
// 带有默认值的可选参数...
email:send {user=foo}

この例では、Artisan コマンドを呼び出すときに

--queue スイッチを指定できます。 --queue スイッチが渡された場合、このオプションの値は true、それ以外の場合は false:

/**
 * 命令行的名称及签名。
 *
 * @var string
 */
 protected $signature = 'email:send {user} {--queue}';

##

値のあるオプション

次に、値のあるオプションを見てみましょう。ユーザーにオプションの値を指定させる必要がある場合は、オプション名の末尾に等号 = をサフィックスとして追加する必要があります:

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}

このメソッドを呼び出すと、user パラメーターの入力パラメーターをコマンド ラインに順番に渡すことができます。たとえば、次のコマンドは us​​er の値を ['foo', 'bar'] に設定します。

email:send {user*}

配列を受け取るオプションを定義する場合、各オプションの値はコマンドラインにはオプション名をプレフィックスとして付ける必要があります:

php artisan email:send foo bar

説明を入力してください

パラメータとオプションを指定できます。説明を追加して別々にします。コマンドを定義するためにもう少しスペースが必要な場合は、自由に複数行に分割してください:

email:send {user} {--id=*}
php artisan email:send --id=1 --id=2

Command I/ O

Get input

コマンドが実行されると、明らかに、によって受け取られたパラメータとオプションを取得する必要があります。コマンド値。 argument メソッドと option メソッドを使用して目的を達成できます。

/**
 * 命令行的名称及签名。
 *
 * @var string
 */
 protected $signature = 'email:send
                 {user : The ID of the user}
                 {--queue= : Whether the job should be queued}';

すべてのパラメータを array 配列として取得したい場合arguments メソッド:

/**
 * 执行命令。
 *
 * @return mixed
 */
 public function handle(){
     $userId = $this->argument('user');    
     //
 }

パラメータの取得と同様に、option メソッドはオプションの値を簡単に取得できます。すべてのオプションを配列として取得するには、options メソッドを使用します。

$arguments = $this->arguments();

パラメータまたはオプションが存在しない場合は、null が返されます。

対話型入力

出力を表示するだけでなく、コマンドの実行中にユーザーに入力を求めることもできます。 ask メソッドはユーザーに入力を求めてそれを受け取り、ユーザーの入力はコマンドに渡されます:

// 获取一个指定的选项值
$queueName = $this->option('queue');
// 获取所有的选项值
$options = $this->options();

secret メソッドと ask 方法は似ていますが、ユーザーがコンソールに入力すると、その入力は非表示になります。この方法は、ユーザーがパスワードなどの機密情報を入力する必要がある場合に適しています。

/**
 * 执行命令。
 *
 * @return mixed
 */
 public function handle(){
     $name = $this->ask('What is your name?');
 }

確認の要求

ユーザーに簡単な情報の確認を求める場合は、次のようにします。 confirm メソッドを使用できます。デフォルトでは、このメソッドは false を返します。ただし、ユーザーが応答に y または yes を入力すると、true が返されます。

$password = $this->secret('What is the password?');

Autocomplete

anticipate メソッドを使用して、可能な選択肢のオートコンプリートを提供できます。ユーザーはオートコンプリート プロンプトを無視して、任意の回答を入力できます。

if ($this->confirm('Do you wish to continue?')) {
    //
 }

Multiple Choice

ユーザーにいくつかの事前設定された選択肢を提供したい場合は、次のようにすることができます。 choice メソッドを使用します。ユーザーに選択の余地がない状況に対処するために、デフォルト値のインデックスを設定することもできます。

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

出力の書き込み

lineinfocommentquestionerror メソッドを使用して、出力を端末に送信します。各メソッドは、適切な ANSI 色を使用してその目的を示します。たとえば、一般的な情報をユーザーに表示してみましょう。一般的には、出力をコンソールに緑色で表示する info メソッドを使用するのが最善です。エラー メッセージを表示するには、

error

メソッドを使用します。エラー メッセージは赤色で表示されます:

$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
色の設定をせずに出力をコンソールに表示したい場合は、

line

メソッドを使用してください:

/**
 * 执行命令。
 *
 * @return mixed
 */
 public function handle(){
     $this->info('Display this on the screen');
 }

テーブル レイアウト

複数行および行データの書式設定された出力の場合、

table

メソッドの方が扱いが簡単です。受信したテーブルヘッダーと行データに基づいて、幅と高さを動的に計算します。

$this->error('Something went wrong!');

プログレスバー

時間のかかるタスクの場合、これは非常に必要です。進歩を促すために。出力オブジェクトを使用して、進行状況バーを作成、ロード、および停止します。まず、タスクの合計ステップ数を定義し、タスクが実行されるたびにプログレス バーをロードします。

$this->line('Display this on the screen');

より高度な使用方法については、

Symfony プログレス バー コンポーネントのドキュメント

を参照してください。

コマンドの登録

app/Console/Commands コンソールカーネルの commands メソッドが ## を呼び出すため、ディレクトリ内のコマンドが登録されます。 # 負荷###。実際、load を自由に呼び出して、他のディレクトリにある Artisan コマンドをスキャンできます。

$headers = ['Name', 'Email'];
$users = App\User::all(['name', 'email'])->toArray();
$this->table($headers, $users);

app/Console/Kernel.php## で

を実行することもできます。 # file $commands 属性に手動で登録したコマンドのクラス名。 Artisan が起動すると、この属性にリストされているコマンドがサービス コンテナによって解析され、Artisan に登録されます:

$users = App\User::all();
$bar = $this->output->createProgressBar(count($users));
$bar->start();foreach ($users as $user) { 
   $this->performTask($user);    
   $bar->advance();
}$bar->finish();

プログラム呼び出しコマンド
場合によっては、たとえば、ルートまたはコントローラーでアーティザン コマンドをトリガーする場合など、CLI の外部でアーティザン コマンドを実行する必要があります。呼び出しを実装するには、

Artisan

ファサードの

call メソッドを使用できます。 call メソッドの最初のパラメーターはコマンド名を受け取り、2 番目のパラメーターは配列の形式でコマンド パラメーターを受け取ります。終了コードが返されます:

/**
 * 注册应用的命令
 *
 * @return void
 */
 protected function commands(){ 
    $this->load(__DIR__.'/Commands');    
    $this->load(__DIR__.'/MoreCommands'); 
   // ...
}
あるいは、Artisan コマンド全体を文字列として call

メソッドに渡すこともできます:

protected $commands = [ 
   Commands\SendEmails::class
  ];
Artisan

facade

queue このメソッドは、アーティザン コマンドをキューに入れ、バックグラウンド処理のためにキュー ワーカー プロセスに渡すことができます。この方法を使用する前に、必ずキューを設定し、キュー リスナーを実行してください:

Route::get('/foo', function () { 
   $exitCode = Artisan::call('email:send', [  
         'user' => 1,
          '--queue' => 'default' 
       ]);  
     //
 });
Artisan コマンドによってディスパッチされる接続またはタスクを指定することもできます:
Artisan::call('email:send 1 --queue=default');

# #配列値を渡す

配列を受け入れるオプションが定義されている場合は、配列をオプションに直接渡すことができます:
Route::get('/foo', function () { 
   Artisan::queue('email:send', [   
        'user' => 1,
         '--queue' => 'default' 
        ]); 
      //
});

ブール値を渡す

オプション値オプションを指定する必要はありません。たとえば、
移行:refresh

コマンドの

--force

オプションは、true## を渡すことができます。 # または false:

Artisan::queue('email:send', [ 
   'user' => 1, 
   '--queue' => 'default'
 ])->onConnection('redis')->onQueue('commands');

コマンドの相互呼び出し

call
メソッドを使用して、他のアーティザン コマンドを呼び出すことができます。

call

メソッドは、配列形式でコマンド名とオプションを受け取ります。

Route::get('/foo', function () { 
   $exitCode = Artisan::call('email:send', [    
       'user' => 1,
        '--id' => [5, 13]   
      ]);
 });
コンソール コマンドのすべての出力を抑制したい場合は、callSilent# ## 方法。 callSilent の使用方法は

call

と同じです:

$exitCode = Artisan::call('migrate:refresh', [
    '--force' => true,
  ]);
この記事は、LearnKu.com Web サイトで最初に公開されました。