Thinkphp 5コマンドライン実行コード

5502 ワード

説明:コマンドラインで正常なtp 5コードを実行する方法
前言:その前に、phpインストール、環境変数構成など、linux phpコマンドラインを正常に使用できるはずです.
      
简単な例の実行:公式サイトのドキュメントのコマンドラインについての绍介はとても短くて、接触したことがなくてとても云の中で雾の中で、どうでもいいです.もちろん、ソースコードの例を見てもいいです.何回デバッグしても基本的に理解できます.
この文章は主にソースコードをデバッグしたくないか、参考にして使用するために使われています.
      hello word ! PHPコマンドhelloを構築しました
      #>   php think hello  
      hello word !
コードの例
まずアプリケーションフォルダの下に新しいフォルダcommand(カスタムTpコマンドを置くための)を作成します.私たちはHelloと名付けました.php(勝手に取る)
setName('hello')
            ->setDescription('hello word !');
    }


    /**
     *   execute
     * {@inheritdoc}
     */
    protected function execute(Input $input, Output $output)
    {
        $output->writeln('hello word !');
    }
}
?>

これで簡単なhelloコマンドが完了しました.
しかし、cdはtpルートディレクトリ(thinkというphpファイルがあるディレクトリ)にphp think helloを実行しています.Command"hello"is not defined.
これは、プロファイルがまだ1つ欠けているためです.
アプリケーションの編集php(なければ新しい)にHelloを加える.phpファイルのnamespace

では、helloコマンドが完了しました.簡単じゃないの?
今からステップアップ版を始めます.ブラウザアクセスのようにコマンドラインでphpコードを実行するにはどうすればいいですか?
私たちはhelloコマンドを修正しますか?それともhello wordを出力しますか?
ここではindexモジュール、indexコントローラ、indexメソッド(action)があります.

helloコマンドコード
setName('hello')                                 //    
            ->setDefinition([                           //Option   Argument      , Argument           .   
                new Option('option', 'o', Option::VALUE_OPTIONAL, "  option  "),       //      php think hello  --option test   -o test
                new Argument('test',Argument::OPTIONAL,"test  "),                        //        php think hello  test1 (         test1         Argument  test)
                //...
            ])
            ->setDescription('hello word !');                               //    
    }

    /**
     *   execute         ---    
     * {@inheritdoc}
     */
    protected function execute(Input $input, Output $output)
    {                                                           //Input             Output      
        $request = Request::instance([                          //                input()           Request     
            'get'=>$input->getArguments(),                    //  1:  input->Arguments   Request->get            input('get.')    
            'route'=>$input->getOptions()                       //  2:  input->Options   Request->route             request()->route(false)   
            //...
        ]);
        $request->module("Index");                          //       Index               model('user')           model('index/user')
//        $request->controller('index')->action('index');       //  controller action

        $output->writeln(controller('index/Index')->index());       //  index  index   index   ,      
    }
}

出力ハローワード!
基本的にはここまでですが、ソースコードやtp実装のいくつかのコマンドの例をもっと詳しく知りたいなら、かなり明らかです. 
もちろん見続けることもできますが、あまり詳しくはありません.基本的な紹介があります.
ファイルアーキテクチャの詳細:
ファイル・エントリのディレクトリ構造から説明します.
---------------
|-thinkエントリファイル
|-thinkphpフレームワークディレクトリ
      |-console.phpコマンドラインエントリ
      |-library
          |-think
     |-App.php  ---App::initCommon() ;これはtpの初期化関数です.それを実行するだけで、tp 5フレームワーク全体の機能を使用することができます.
     |-Console.php    ---Console::init(); これはtpのコマンドロード関数で、tpのカスタムコマンドを使用することができます.
      ....
フレームワークの実装の紹介(興味のある自分でソースを見に行く)を省略して、よく使われるが接触が少ないいくつかのファイルを簡単に話して、結局私たちの目的はただ使うだけです
1.もちろんthinkconsoleCommand:
   
コマンドを実行するエントリファイルは、フレームワークが独自に定義したexecute()のほか、initialize(Input$input,Output$output)を初期化するときに$this->setCode(callback fn)を通過することもできます.では、手動で実行エントリを設定します(callbackはどのように使用しますか?call_user_func()を参照).たとえば、$this->index()を呼び出すと、$this->setCode([$this,'index']);
これにより、1つのコマンドで異なるエントリを論理的に区別することができます.
 
2.input :
ソース注釈が詳しくないようです.あなたのすべての入力がこの中で取ればいいだけです.主に2つのOptionとArgumentに分けてどのように定義するかはあなた次第です.
3.request :
リクエストをここに置くのはちょっと不適切ですが、誰がtp helper関数をリクエストに基づいているのでしょうか.必要なくても使えますが、ブラウザと同じ体験(例えば同じコードがブラウザとコマンドラインで同時に実行できる)をするには、自分で手動でrequestをインスタンス化しましょう.
自分でソースを見に行きましょう.注釈が詳しいです.
一般的にinstance(['post'=>[],'get'=>[]...])についていくつかのパラメータをインスタンス化し、バインドして$request->module('index')バインドすると、現在のモジュールはそれほど悪くない.さすがに$SERVERとか自分で作っても意味ない