我需要管理特定模型的记录历史。按照下面的示例(https://laravel.com/docs/5.2/eloquent#events),我在AppServiceProvider.php文件中做了这样的操作:
use AppSourceModel;
use AppHistory;
use IlluminateSupportFacadesAuth;
use IlluminateSupportServiceProvider;
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 = 'AppSourceModel';
$his->save();
});
}
...
问题是这样的Auth::User()返回NULL…
我该如何解决这个问题?是否有办法使Auth在appserviceprovider工作,或者我应该把我的保存事件移动到其他地方?
因为这个闭包是在模型保存时调用的,所以假设存在一个经过身份验证的用户,我希望它能够工作。
我可以确认使用tinker:
>>> AppUser::saving(function ($user) { echo "AUTH USER ID: " . Auth::user()->id; });
=> null
>>> Auth::login(AppUser::find(1));
=> null
>>> AppUser::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 = 'AppSourceModel';
$his->save();
});
我认为正确的地方听模型事件是EventServiceProvider (AppProvidersEventServiceProvider)。
只要把你的代码移动到EventServiceProvider中的"boot"方法,你就完成了。
<?php
namespace AppProviders;
use IlluminateFoundationSupportProvidersEventServiceProvider as ServiceProvider;
use IlluminateSupportFacadesEvent;
use AppSourceModel;
use AppHistory;
use IlluminateSupportFacadesAuth;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'AppEventsSomeEvent' => [
'AppListenersEventListener',
],
];
/**
* 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 = 'AppSourceModel';
$his->save();
});
}
}
注意:你可以像这样包含facade: "use Auth"