2016-09-09 8 views
0

特定のモデルの履歴を管理する必要があります。 は、だから私は私のAppServiceProvider.phpファイルにこのような何かをした(https://laravel.com/docs/5.2/eloquent#events)ここでは例を次に示します。Laravel:履歴用にモデルのシリアル化されたコピーを保存する

use App\SourceModel; 
use App\History; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider { 

    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     SourceModel::saving(function ($source) { 
      $his= new History(); 
      $his->record = $source->toJson(); 
      $his->user_id = Auth::User()->id; 
      $his->saved_id = $source->id; 
      $his->saved_type = 'App\SourceModel'; 
      $his->save(); 
     }); 
    } 

... 

問題が...

どのように認証が::ユーザー()がNULLを返し、このようにしていますこの問題を解決できますか? appserviceproviderでAuthを動作させる方法があるのでしょうか、私は節電イベントを別の場所に移動する必要がありますか?

答えて

1

「\認証を使用する」、私はこれを仮定して動作するように期待される認証されたユーザが存在します。私は、これはいじくりを使用して作業をして確認することができた

>>> App\User::saving(function ($user) { echo "AUTH USER ID: " . Auth::user()->id; }); 
=> null 
>>> Auth::login(App\User::find(1)); 
=> null 
>>> App\User::find(1)->save(); 
AUTH USER ID: 1⏎ 
=> true 

したがって、私はAuth::user()戻りnull場合、このモデルは、認証されたユーザーせずに、それはあなたが追加する必要が発生する可能性があれば保存されたことを言うだろうチェック:

SourceModel::saving(function ($source) { 
     $his= new History(); 
     $his->record = $source->toJson(); 
     $his->user_id = (Auth::check()) ? Auth::User()->id : 0; 
     $his->saved_id = $source->id; 
     $his->saved_type = 'App\SourceModel'; 
     $his->save(); 
    }); 
0

モデルイベントをリッスンする適切な場所は、EventServiceProvider(App \ Providers \ EventServiceProvider)です。

EventServiceProviderのコードを "boot"メソッドに移動するだけです。

<?php 
namespace App\Providers; 

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; 
use Illuminate\Support\Facades\Event; 
use App\SourceModel; 
use App\History; 
use Illuminate\Support\Facades\Auth; 

class EventServiceProvider extends ServiceProvider 
{ 
    /** 
    * The event listener mappings for the application. 
    * 
    * @var array 
    */ 
    protected $listen = [ 
     'App\Events\SomeEvent' => [ 
      'App\Listeners\EventListener', 
     ], 
    ]; 
    /** 
    * Register any events for your application. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     parent::boot(); 
     // 

     SourceModel::saving(function ($source) { 
      $his= new History(); 
      $his->record = $source->toJson(); 
      $his->user_id = Auth::User()->id; 
      $his->saved_id = $source->id; 
      $his->saved_type = 'App\SourceModel'; 
      $his->save(); 
     }); 
    } 
} 

注:あなたはこのようなファサードを含めることができます。このクロージャは、モデルが保存されたときに呼び出されるので

+0

なぜAuth :: user()がnullを返す場合、この変更は何に対処するのですか?モデル保存のイベントから問題が発生した場合、イベントは正常に初期化されます。 – Devon

+0

住所の変更はちょっとしたヒントです。 – MoeinPorkamel

+0

イベントリスナーは、EventServiceProviderに追加する必要はなく、意味のある場所に追加できます。通常、関連するサービスプロバイダでは、どこでも一度だけ呼び出されることができます。 (リスナーが複数回呼び出された場合、コールバックは複数回実行されます) – Devon

関連する問題