ホームページ  >  記事  >  PHPフレームワーク  >  コマンドラインスクリプトを実行するLaravelについて話しましょう

コマンドラインスクリプトを実行するLaravelについて話しましょう

WBOY
WBOY転載
2022-04-06 17:49:562981ブラウズ

この記事では、Laravel に関する関連知識を提供します。主に、コマンド ライン スクリプトの実行に関連する問題を紹介します。Laravel には、Console ディレクトリという別のディレクトリがあります。スクリプト ファイルの保存に使用されます。 。一緒に見てみましょう。皆さんのお役に立てれば幸いです。

コマンドラインスクリプトを実行するLaravelについて話しましょう

推奨される学習: Laravel の入門

Laravel には別のディレクトリがあり、それが Console ディレクトリであることがわかりました。 . スクリプト ファイルを保存するために使用されます。このスクリプト ファイルは通常、php コマンドを通じて実行するコマンド ライン スクリプトを指します。このスクリプトには、多くのフレームワークでそのような機能があります。最新のアプリケーション開発では、データ統計、データ エクスポート、キュー処理、一部の自動バックエンド実行プログラムなどの時間のかかる機能を、このコマンド ライン スクリプトを使用して実行する必要があります。

デフォルトで提供されるスクリプト

現在のフレームワーク ディレクトリで、ルート ディレクトリにある php 職人を実行すると、コマンド ラインのヘルプ情報が表示されます。これは、既存のすべてのコマンド ラインのリストです。脚本。最初の記事では、これらのコマンドのうち 2 つについて説明しました。

# php artisan key:generate
# php artisan serve

その機能の 1 つは、暗号化されたキャッシュなどに使用する必要がある一意のキーを生成することであり、もう 1 つは、それに付属する単純なサーバーを実行することです。スクリプト名から、スクリプトは : で区切ることができ、コロンの前に、cache:xxx 関連や make:xxx 関連などの大きなカテゴリがあることがわかります。キャッシュはキャッシュ情報の処理に関連し、メイクは必要なファイルの作成に関連します。たとえば、コントローラーを作成するには make:controller を使用し、データ モデルを作成するには make:model を使用します。

これらのデフォルトの組み込みスクリプトについては、関連する内容を学習するときに学習します。

スクリプトのカスタマイズ

スクリプトのカスタマイズは非常に簡単です。 make:command コマンドを使用してコマンド ライン スクリプトを生成できます。

# php artisan make:command test1
Console command created successfully.

この時点で、test1.php ファイルが app/Console/Commands ディレクトリに表示されます。このファイルを開くと、いくつかの変更を加える必要があります。

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'command:name';
/**
 * The console command description.
 *
 * @var string
 */
protected $description = 'Command description';

signature は現在のスクリプトの名前を設定するために使用され、description はスクリプトのコメント説明を定義するために使用されます。どこで使われているのでしょうか?実際、signature は、php 職人を通じてこのスクリプトを実行するときに使用する必要がある名前です。たとえば、ここで php 職人を直接実行すると、次の実行可能なコマンド ライン スクリプトが表示されることがわかります。

 command
  command:name         Command description

もちろん、このデフォルト名を使用するのは得策ではないため、これら 2 つのプロパティを変更できます。

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'ZyBlog:Test1';
/**
 * The console command description.
 *
 * @var string
 */
protected $description = '硬核测试1';

この時点で再度phpArtisanを実行すると、定義した情報が表示されます。

 ZyBlog
  ZyBlog:Test1         硬核测试1

このスクリプトを実行するのは非常に簡単です。

# php artisan ZyBlog:Test1

もちろん、まだ何もしていないため、出力はありません。次に、受信パラメータと出力情報を組み合わせます。パラメーターを受け取るには、署名で受け取りたいパラメーターとオプションを定義する必要があります。 PHP でスクリプトのパラメーターとオプション情報を受け取る方法について以前説明した記事を覚えていますか? Laravel はこれらをすでにカプセル化しているため、受信や処理にこれらの関数を使用する必要はなく、直接使用するだけです。復習が必要な学生は、[PHP コマンド ライン パラメーターの取得方法] mp.weixin.qq.com/s/dFuGaM1JT… にアクセスして復習または学習できます。

protected $signature = 'ZyBlog:Test1 {a=1} {--b=*}';
/**
 * Execute the console command.
 *
 * @return int
 */
public function handle()
{
    echo "欢迎进来测试!", PHP_EOL;
    print_r($this->arguments());
    // Array
    // (
    //     [command] => ZyBlog:Test1
    //     [a] => 1
    // )
    print_r($this->options());
    // Array
    // (
    //     [b] => Array
    //         (
    //             [0] => 2
    //         )
    
    //     [help] => 
    //     [quiet] => 
    //     [verbose] => 
    //     [version] => 
    //     [ansi] => 
    //     [no-ansi] => 
    //     [no-interaction] => 
    //     [env] => 
    // )
    echo $this->argument('a'); // 1
    print_r($this->option('b'));
    // Array
    // (
    //     [0] => 2
    // )
    return 0;
}

handle() 関数では、現在のスクリプトが実行する必要がある関数コードを記述することができます。このうち、スクリプトのパラメータ情報はarguments()とargument()を通じて受け取ることができ、スクリプトのオプション情報はoptions()とoption()を通じて受け取ることができます。パラメータやオプションについては以前の記事でも説明しているので割愛しますが、すべて基本に基づいています。

パラメータオプションのソースコード分析

パラメータとオプションについては、Laravel の基礎となる呼び出しは実際には symfony の Console コンポーネントです。symfony/console/Input/ArgvInput.php では、以下のコードに移動することがわかります。 。

public function __construct(array $argv = null, InputDefinition $definition = null)
{
    $argv = $argv ?? $_SERVER['argv'] ?? [];
    // strip the application name
    array_shift($argv);
    $this->tokens = $argv;
    parent::__construct($definition);
}
// ……………………
// ……………………
protected function parse()
{
    $parseOptions = true;
    $this->parsed = $this->tokens;
    while (null !== $token = array_shift($this->parsed)) {
        if ($parseOptions && '' == $token) {
            $this->parseArgument($token);
        } elseif ($parseOptions && '--' == $token) {
            $parseOptions = false;
        } elseif ($parseOptions && 0 === strpos($token, '--')) {
            $this->parseLongOption($token);
        } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
            $this->parseShortOption($token);
        } else {
            $this->parseArgument($token);
        }
    }
}

明らかに、symfony では argv はパラメーターとオプションを取得するためにも使用され、それらは入力変数に入れられて渡されます。この入力変数は非常に重要であり、後でリクエスト関連のコンテンツを学習するときにも触れます。その後、実行コードで、つまり Command の handle() メソッドで argument() または option() を使用して、この入力のデータが取得されます。これらはブレークポイントのデバッグから確認できます。

コマンドラインスクリプトを実行するLaravelについて話しましょう

では、Laravel はどのように handle() 関数を実行するのでしょうか?まず、artisan ファイルを介して laravel/framework/src/Illuminate/Foundation/Console/Kernel.php ファイルを呼び出します。Kernel.php の handle() メソッドで、symfony/console/Application.php が呼び出され、次のように入力します。 laravel/framework /src/Illuminate/Console/Command.phpのexecute()メソッドを実行し、コールバックを通じてカスタマイズしたhandle()メソッドを呼び出します。

laravel/framework/src/Illuminate/Console/Command.php の下部では、symfony の下の console/command.php のメソッドが引き続き呼び出されることに注意してください。

呼び出しチェーン全体は非常に長いですが、Laravel が実際に Symfony に基づいたシェルであることがはっきりとわかります。これはコマンドラインだけではなく、Web リクエストの観点から見ると、Symfony は依然として最下位レベルで重要な役割を果たしています。

推奨学習: Laravel ビデオ チュートリアル

以上がコマンドラインスクリプトを実行するLaravelについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。