2017-09-19 5 views
1

laravelのキューを扱うときに問題があります。私はアーキテクチャのスケーリングに取り組んでいるので、私がやることのほとんどはキューやジョブを使って実装されています。たとえば、大きなファイルを処理する場合、ファイル内の1000行ごとにジョブが作成され、結果が出力ファイルに保存されます。Laravel実行前と実行後にジョブクラスのメソッドを呼び出す方法

私は現在、ジョブの親として使用している「プロセス」クラスを持っています。プロセスクラスには、job()メソッドが呼び出された後、メソッドが実行された後に呼び出されるstart()およびend()メソッドがあります。現在の解決策は、handleメソッドからこれらのメソッドを呼び出すことですが、この解決策はジョブクラス自体で不必要なコードを増加させ、これらのメソッドを呼び出すことを念頭に置く実装者の責任です。

public function handle() 
{ 
    $this->start(); // <- implementer has to remember to call this 

    // Do the actual handle functionality 

    $this->end(); // <- and this 
} 

私は仕事(子)クラスからの親メソッド呼び出しを必要としない "クリーン"な方法があるのだろうかと思いましたか? queue eventsを使用しようとしましたが、指定されたイベントオブジェクトからジョブクラスを構築できません。 Dispatching an eventは、それぞれのジョブクラスにこれら2つの余分な行を追加する必要があるため、実際には役に立ちません。

私は魔法の__call()メソッドも調べましたが、これは "handle"メソッドが存在しない場合にのみ機能します。これはartisan make:jobコマンドデフォルトでメソッドを生成します(実装者がそれを削除するのに十分な知識を必要とします)。

これについてはっきりするように、現在の解決策は実際には機能しますが、それぞれのクラスごとに同じ行を複製するようなコードの臭いのようです。

答えて

1

あなたはハンドル機能を持​​つことになり、親クラスを作成することができ、そして彼は、たとえば、あなたのロジックを持っています子で保護された関数を呼び出します:

class MyJob implements ShouldQueue 
{ 
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 

    protected function start() { 
     // your start logic 
    } 

    protected function stop() { 
     // your stop logic 
    } 

    protected function process() { 
     // will be overrittten 
    } 

    public function handle() { 
     $this->start(); 
     $this->process(); 
     $this->stop(); 
    } 
} 

そして、すべてのあなたの仕事は、拡張されますあなたのたとえば、

class SpecificJob extends MyJob 
{ 
    protected function process() { 
     // logic 
    } 
} 
+0

ニースとシンプル。私は無意識のうちにすべての子クラスのhandleメソッドで終わるすべてのジョブを生成するためにartisanコマンドを使用したいと思った後、何か似たようなことを無視しました。私はそれがきれいであるときmake:jobなしで子のジョブを書いたり生成したりするのはあまりにも多くの努力ではないと確信しています。あなたのソリューションを "一つ"上げるには、私は親を抽象クラスにし、 "プロセス"を抽象関数にして、それが子によって宣言されていることを確認することを個人的にお勧めします。 – Nonetallt

0

完了後に呼び出す関数については、hereを参照してください。あなたが掘り起こすならば、BEFOREメソッドをどこに置くべきかがわかります。

+0

私はそれを試みましたが、キャッチがあります:イベントコールバックによって返される "job"変数は、逆シリアル化されたジョブではなく、[ジョブスーパークラスを照らす](https://laravel.com/api/5.4/)のインスタンスです。 Illuminate/Queue/Jobs/Job.html)。また、「解決」メソッドは保護されているため、シリアル化されたデータを使用してオブジェクトを再構築することはできません。つまり、 "process"クラスのメソッドを呼び出すことはできません。 – Nonetallt

関連する問題