#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
(предполагая, что это модель в вашем проекте). Это отвечает на ваш вопрос?