Создание таблицы журнала с использованием событий Laravel

#laravel #postgresql #events #event-handling #laravel-8

Вопрос:

Я хочу создавать журнал каждый раз, когда происходит вставка в files таблицу. То есть каждый раз, когда происходит вставка в files таблицу, должно запускаться событие, чтобы автоматически создать для него журнал. Log таблица должна иметь 3 столбца id , fileid — первичный ключ таблицы файлов amp; logDetails ,где в logDetails столбце хранится msg, подобный 1 file inserted .

я прочитал это — https://laravel.com/docs/8.x/events а также искал еще много , но это не помогло мне найти, с чего мне начать. Для этого я создал страницу событий и страницу слушателей. Но я не знаю, что в этом написать.Приведенный ниже контроллер и модель хорошо выполняют вставку в files таблицу. И там, где мне нужна ваша помощь, это код для создания журнала для этой вставки. Мы очень ценим любую помощь.

Контроллер

 <?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppModelsFileLogs;
use IlluminateSupportFacadesValidator;
use AppEventsInsertFileLog;

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 AppEvents;

use IlluminateBroadcastingChannel;
use IlluminateBroadcastingInteractsWithSockets;
use IlluminateBroadcastingPresenceChannel;
use IlluminateBroadcastingPrivateChannel;
use IlluminateContractsBroadcastingShouldBroadcast;
use IlluminateFoundationEventsDispatchable;
use IlluminateQueueSerializesModels;
use AppModelsFileLogs;

class InsertFileLog
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $order;
   
    public function __construct(FileLogs $order)
    {
        $this->order = $order;
    }
}
 

Слушатель

 <?php

namespace AppListeners;

use AppEventsInsertFileLog;
use IlluminateContractsQueueShouldQueue;
use IlluminateQueueInteractsWithQueue;
use AppModelsLogs;

class FileLogListener
{
    public function __construct()
    {
        //
    }
    public function handle(InsertFileLog $event)
    {
        //
    }
}
 

EventServiceProvider.php

 class EventServiceProvider extends ServiceProvider
{
    
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];

    public function boot()
    {
        //
    } 
} 
 

Комментарии:

1. вы можете рассмотреть возможность использования этого пакета.

2. @zahidhasanemon Я спрашиваю об этом на самом базовом уровне. Ссылка, которую вы дали, также не содержит никаких сведений, указывающих, на какой странице следует разместить определенный код

3. Вы работаете с моделями? Возможно , более простым решением для прослушивания модельных событий (например created , того, что вы ищете) являются наблюдатели моделей .

4. @EricLandheer хорошо. Я понял, что здесь я могу использовать наблюдателей. Но я спрашиваю, как заполнить код здесь, на моих страницах событий и прослушивателей?

5. @EricLandheer Какой код я должен заполнить на этой странице событий и слушателей, чтобы создать этот журнал только для вставки ? вот о чем я спрашиваю. Пожалуйста, опубликуйте этот код в качестве ответа, если вы знаете, каков код для создания такого журнала.

Ответ №1:

Он AppProvidersEventServiceProvider предлагает способ регистрации событий и слушателей. Ключ в Event том , что значения являются одним или несколькими Listeners . Вам следует обновить свой код, чтобы он содержал следующее:

Поставщик услуг по обслуживанию событий

 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); строка перед возвращением ответа об успешном выполнении в вашей 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);
        }
    }
}
 

ФилеЛогЛистенер

 <?php

namespace AppListeners;

use AppEventsInsertFileLog;
use AppModelsLog;
use IlluminateContractsQueueShouldQueue;
use IlluminateQueueInteractsWithQueue;

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',
        ]);
    }
}
 

Наблюдатели за моделями

В качестве альтернативы наблюдатели модели предоставляют решение без необходимости вручную регистрировать события/прослушиватели, поскольку они прослушивают Eloquent events наблюдаемую модель creating , например:, created , updated , и т.д. deleted

Комментарии:

1. в этом, где я должен указать, чтобы создать новую строку в logs таблице

2. handle Функция FileLogListener . Это функция прослушивателя, которая запускается после InsertFileLog запуска. Имеет ли это смысл?

3. можете ли вы написать, какой код я должен вставить в этот метод обработки?

4. в модели у меня есть имя таблицы files , в которую я вставляю файлы. Но где я укажу, чтобы вставить его данные журнала в log таблицу? -Это мой основной вопрос

5. Я обновил свой ответ примером создания Log в FileLogListener (предполагая, что это модель в вашем проекте). Это отвечает на ваш вопрос?