2017-06-19 5 views
0

モデルが削除された後にタスクを実行するためにモデルイベントをフックしたいと思います。 I私のモデルに次のコードを追加しました:Laravel 5のモデルイベントコールバックに関数名を渡す方法

protected static function boot() 
{ 
    parent::boot(); 

    static::deleted('static::removeStorageAllocation'); 
} 

ではなく、私はそれのためにかなり醜いスポットを思わブート機能、でクロージャ内で実行したいロジックを入れて、私は、メソッドのシグネチャに気づきましたおそらく "\ Closure | string $ callback"が必要ですが、私が上でやったように関数名を指定する方法はありますか?私はうまくいくものを考え出すことができない。私は、組み合わせの多くを試してみた:

'self::removeStorageAllocation' 
'static::removeStorageAllocation' 
'\App\MyModel::removeStorageAllocation' 

私はおそらく私の関数を呼び出すクロージャを指定することができます知っているが、私は$コールバックの文字列形式が何のためにあるのか思ったんだけど?あなただけの無名関数渡すことができ

+0

静的:: removeStorageAllocation()の最後に()を追加したい場合は、 –

+0

と同じエラーが表示されます。ReflectionException:メッセージ 'Class static :: removeStorageAllocation()が存在しません' laravelフレームワークはメソッドではなくクラスを期待しています。また、実際には、削除イベントを発生させたモデルへの参照となる単一のパラメータがあります – madz

答えて

1

/** 
* Register a deleted model event with the dispatcher. 
* 
* @param \Closure|string $callback 
* @param int $priority 
* @return void 
*/ 
public static function deleted($callback, $priority = 0) 
{ 
    static::registerModelEvent('deleted', $callback, $priority); 
} 

ますされます:$コールバックの文字列表現を知るために

static::deleted(function() { 
    static::removeStorageAllocation(); 
}); 

を、削除のソースを見ることができますイベントリスナーの登録を確認してください:

/** 
* Register a model event with the dispatcher. 
* 
* @param string $event 
* @param \Closure|string $callback 
* @param int $priority 
* @return void 
*/ 
protected static function registerModelEvent($event, $callback, $priority = 0) 
{ 
    if (isset(static::$dispatcher)) 
    { 
     $name = get_called_class(); 

     static::$dispatcher->listen("eloquent.{$event}: {$name}", $callback, $priority); 
    } 
} 

したがって、$ callbackは最終的にリスナーとして使用されます。文字列表現は、メソッドではなく、リスナークラスの名前になりそうです。

+0

返信ありがとうございます。しかし、私が「私の関数を呼び出すクロージャを指定することができますが、 $コールバックの文字列形式が何であるか疑問に思っていますか? " – madz

+0

@madzコードをトレースするだけです。私は更新を提供しました。 – Devon

+0

ありがとう、私はコードをトレースしようとしましたが、少し紛失して、かなり新しいPHP(およびlaravel)になってしまいました。乾杯 – madz

関連する問題