Как передать параметр в наблюдатель событий laravel elequent модели - PullRequest
1 голос
/ 09 марта 2020

У меня есть модель в laravel, и я хочу сделать что-то после первого создания объекта моей модели. самый простой способ - добавить метод загрузки stati c в класс моей модели, как показано ниже:

class modelName extends Model
{
      public static function boot()
      {
         parent::boot();

         self::created(function ($model) {
             //the model created for the first time and saved
             //do something
            //code here
         });
     }
}

пока все хорошо! проблема в том, что единственным параметром, который принимает созданный метод, является сам объект модели (согласно документации):

Каждый из этих методов получает модель в качестве единственного аргумента.

https://laravel.com/docs/5.5/eloquent#events

Мне нужно больше аргументов для работы после создания модели. как я могу это сделать?

Или есть какой-то другой способ сделать что-то, пока гарантировано, что модель была создана?

laravel версия 5,5.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Я решил проблему, используя свойство stati c в классе модели eloquent:

class modelName extends Model
{
  public static $extraArguments;
  public function __construct(array $attributes = [],$data = [])
  {
     parent::__construct($attributes);
     self::$extraArguments = $data  ; 

  public static function boot()
  {
     parent::boot();

     self::created(function ($model) {
         //the model created for the first time and saved
         //do something
        //code here
         self::$extraArguments; // is available in here
     });
   }
}

Это работает! но я не знаю, может ли это вызвать какое-либо другое неправильное поведение в приложении.

Использование laravel событий также является лучшим и более чистым способом сделать это в НЕКОТОРЫХ случаях. Но проблема с решением событий - это вы не может знать, была ли модель создана наверняка, и пришло время вызвать событие, или она все еще находится в статусе создания (а не статус создан).

0 голосов
/ 09 марта 2020

Ты рядом. Вероятно, я бы отправил событие сразу после того, как вы фактически создадите модель в своем контроллере. Как то так.

class WhateverController
{
    public function create()
    {
        $model = Whatever::create($request->all());
        $anotherModel = Another::findOrFail($request->another_id);

        if (!$model) {
            // The model was not created.
            return response()->json(null, 500);
        }

        event(new WhateverEvent($model, $anotherModel));
    }
}
...