Получить $this в методе защищенной модели загрузки Laravel

#php #laravel

#php #ларавель #laravel

Вопрос:

У меня есть код на моей Модели:

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

      if($this->status == 1) {
         static::updated(function () {
            //do something
         }
      }
 }
  

Мне нужно проверить, соответствует ли статус текущей записи == 1, затем сделать static::updated() .
Теперь я получаю сообщение об ошибке: $это не может быть в статической функции.

Как я могу проверить состояние при загрузке защищенной статической функции?

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

1. Это невозможно, потому что статические функции независимы от любого созданного объекта.

2. Вам действительно нужно, чтобы это было статично?

3. Статические функции не могут распознать $this, поскольку это созданный объект, как сказал @Daan. Все, что вы можете попробовать, это либо получить его в параметре, либо попытаться вернуть его из какой-либо функции родительской. итак, в вашей статической функции вы можете получить это как $status = parent::SomeFunctionThatReturnsStatus(); , а затем вы можете использовать $status в своем if состоянии

4. Также не могли бы вы, пожалуйста, рассказать, зачем вам нужно сделать это статической функцией?

Ответ №1:

Как и Daan, упомянутый в комментариях, это невозможно, однако вы могли бы решить это другим способом:

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

      static::updated(function ($model) {
          if ($model->status == 1) {
              //do something
          }
      });
 }
  

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

1. Я уже упоминал, что нужно использовать какую-то другую функцию, чтобы получить переменную $status в качестве параметра функции, а затем использовать ее в этой статической функции.

Ответ №2:

1) Использование $this

Вы должны заменить $this на self:: , чтобы ссылаться на переменную ( $status ), содержащуюся в статическом классе:

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

      if(self::$_status == 1) {
         static::updated(function () {
            //do something
         }); //also close off your method call correctly.
      }
 }
  

2) Проверьте, соответствует ли статус текущей записи = 1

Мне нужно проверить, соответствует ли статус текущей записи == 1, затем выполните static::updated().

Где значение $status установлено / сохранено / доступно? Код, который вы показываете, показывает, что $status задан в самом классе, но как статический класс это будет, э-э, статично.

Возможно, вам потребуется остановить статический класс / метод или передать данные в функцию следующим образом:

  protected static function boot($status = null) {
      parent::boot();

      if($status == 1) {
         static::updated(function () {
            //do something
         }); // close off your method properly.
      }
 }
  

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

1. Второй случай, о котором вы упомянули, — это то, о чем я уже говорил @Dronax, то есть получить переменную $status в качестве параметра функции. :}

2. @Dronax да, но как PHP получает эту информацию?