使用 Laravel Events 创建日志表

如何解决使用 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,例如:creatingcreated、{ {1}}、updated

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?