如何解决使用 Laravel Events 创建日志表
每次插入 files
表时,我都想创建一个日志。也就是说,每次对 files
表进行插入时,都必须触发一个事件以自动为其创建日志。 Log
表需要有 3 列 id
,fileid
- files 表的主键 & logDetails
,其中 logDetails
列存储一个 msg 像 {{1 }}。
我已阅读此 - https://laravel.com/docs/8.x/events 并搜索了更多内容,但这无法帮助我找到应该从哪里开始。我为此创建了一个事件页面和一个侦听器页面。但我不知道在里面写什么。下面的控制器和模型很好地插入到 1 file inserted
表中。我需要您帮助的地方是编写用于为此插入创建日志的代码。非常感谢任何帮助。
控制器
files
模型
<?PHP
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\FileLogs;
use Illuminate\Support\Facades\Validator;
use App\Events\InsertFileLog;
class FileLogController extends Controller
{
public function insert(Request $request) // insertion
{
$validator = Validator::make(
$request->all(),[
'orderId' => 'required|integer',//id of orders table
'fileId' => 'required|integer',//id of file_type table
'status' => 'required|string'
]
);
if ($validator->fails()) {
return response()->json($validator->errors(),400);
}
$obj = new FileLogs();
$obj->orderId=$request->orderId;
$obj->fileId=$request->fileId;
$obj->status=$request->status;
$obj->save();
//dd($obj->id);
if($obj->id!=''){
InsertFileLog::dispatch($order);
return response()->json(['status'=>'success','StatusCode'=> 200,'message'=>'Successfully Inserted','data'=>$obj]);
}
else{
return response()->json(['status'=>'Failed','message'=>'Insertion Failed'],400);
}
}
活动
class FileLogs extends Model
{
use HasFactory;
use SoftDeletes;
protected $table='files';
protected $fillable = [
'orderId','fileId','status'
];
}
听众
<?PHP
namespace App\Events;
use Illuminate\broadcasting\Channel;
use Illuminate\broadcasting\InteractsWithSockets;
use Illuminate\broadcasting\PresenceChannel;
use Illuminate\broadcasting\PrivateChannel;
use Illuminate\Contracts\broadcasting\Shouldbroadcast;
use Illuminate\Foundation\Events\dispatchable;
use Illuminate\Queue\SerializesModels;
use App\Models\FileLogs;
class InsertFileLog
{
use dispatchable,InteractsWithSockets,SerializesModels;
public $order;
public function __construct(FileLogs $order)
{
$this->order = $order;
}
}
EventServiceProvider.PHP
<?PHP
namespace App\Listeners;
use App\Events\InsertFileLog;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use App\Models\Logs;
class FileLogListener
{
public function __construct()
{
//
}
public function handle(InsertFileLog $event)
{
//
}
}
解决方法
App\Providers\EventServiceProvider
提供了一种 register Events and Listeners 的方法。键是Event
,值是一个或多个Listeners
。您应该更新您的代码以包含以下内容:
EventServiceProvider
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,],InsertFileLog::class => [
// Listeners in this array will be executed when InsertFileLog was fired.
FileLogListener::class
],];
public function boot()
{
//
}
}
只有在事件 FileLogListener
被触发后才会触发 InsertFileLog
。为此,您可以执行以下操作,方法是在 InsertFileLog::dispatch($order);
函数中的 return 成功响应之前添加:insert
行。
文件日志控制器
class FileLogController extends Controller
{
public function insert(Request $request) // insertion
{
$validator = Validator::make(
$request->all(),[
'orderId' => 'required|integer',//id of orders table
'fileId' => 'required|integer',//id of file_type table
'status' => 'required|string'
]
);
if ($validator->fails()) {
return response()->json($validator->errors(),400);
}
$obj = new FileLogs();
$obj->orderId=$request->orderId;
$obj->fileId=$request->fileId;
$obj->status=$request->status;
$obj->save();
//dd($obj->id);
if($obj->id!=''){
InsertFileLog::dispatch($obj);
// alternatively,the event helper can be used.
// event(new InsertFileLog($obj));
return response()->json(['status'=>'success','StatusCode'=> 200,'message'=>'Successfully Inserted','data'=>$obj]);
}
else{
return response()->json(['status'=>'Failed','message'=>'Insertion Failed'],400);
}
}
}
FileLogListener
<?php
namespace App\Listeners;
use App\Events\InsertFileLog;
use App\Models\Log;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class FileLogListener
{
public function __construct()
{
//
}
public function handle(InsertFileLog $event)
{
// $event->order contains the order.
// In your question,you have request an example of creating an insertion to the Log table
Log::create([
'fileId' => $event->order->fileId,'logDetails' => '1 file inserted',]);
}
}
模型观察者
或者,Model observers 提供了一种无需手动注册事件/侦听器的解决方案,因为它们会侦听观察模型的 Eloquent events
,例如:creating
、created
、{ {1}}、updated
等
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。