Как проверить наличие переменной с помощью частной функции в классе php?

Вот псевдокод того, что я хочу сделать:

class Test {

  protected  $myVar;

  public function __construct(){
      // get data from DB, returns null if not exist
      $this->myVar = getDataFromDatabase();
  }

  public function myFunc(){

       if (!$this->myVar){
           return response(['message' => 'data not found'],404);
       }

       // do other stuff
  }      
}

Этот код работает хорошо. Теперь я хочу объявить приватную функцию для проверки существования переменной (чтобы очистить мой код и использовать функцию везде).

Это то, что я пробовал:

  public function myFunc(){

       $this->checkExistence();

       // do other stuff
  }  

  private function checkExistence(){
      if (!$this->myVar){
        return response(404);
      }
  }

Но это не работает, потому что я не возвращаю $this->checkExistence();!

И когда я пытаюсь вернуть его:

return $this->checkExistence();

Это работает, но проблема в том, что когда $myVar существует, он не попадает в строку // do other stuff, потому что возвращает всю функцию, которая имеет смысл!

Как мне передать эту проверку существования в приватную функцию!?

попробуйте if ($this->checkExistence()){...}else{...}

Marc 04.04.2019 08:39

где вы вызываете эту функцию?

Danyal Sandeelo 04.04.2019 08:40

Если вы хотите вернуть туда ответ 404, вы можете использовать метод прервать().

Dees Oomens 04.04.2019 08:41

@DanyalSandeelo Я вызываю это в функции myFunc. взгляните на мой второй псевдокод.

Ahmad Mobaraki 04.04.2019 08:42

@DeesOomens, ты прав. Но на самом деле я хочу вернуть ответ json с кодом 404. Обновлю вопрос

Ahmad Mobaraki 04.04.2019 08:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
339
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Если вы хотите вернуть ответ где-то за пределами контроллера, вы всегда можете использовать метод abort(). Как говорится в документации Laravel:

The abort function throws an HTTP exception which will be rendered by the exception handler.

Метод принимает код ответа, а также класс Response (как вы можете посмотреть здесь). Если вы хотите вернуть ответ JSON, вы можете использовать следующий код:

abort(response()->json([], 404));

Я уже делаю это : return response([ 'message' => 'data not found' ], 404);

Ahmad Mobaraki 04.04.2019 08:50

И он работает хорошо и возвращает исключение HTTP, но когда я помещаю этот код в приватную функцию, он не работает.

Ahmad Mobaraki 04.04.2019 08:51

Что вы имеете в виду под не работает? Это не ответ JSON?

Dees Oomens 04.04.2019 08:54
public function myFunc(){ RETURN $this->checkExistence(); } И checkExistense() верните все, что вам нужно.
u_mulder 04.04.2019 08:55

@DeesOomens Извините, забыл удалить return из myFunct, теперь все работает, но abort принимает int только для первого аргумента, а для второго принимает string, ОШИБКА: Object of class Illuminate\Http\JsonResponse could not be converted to int

Ahmad Mobaraki 04.04.2019 08:58

Теперь проблема в том, как abort и вернуть json одновременно.

Ahmad Mobaraki 04.04.2019 08:59

Ах, вы используете Laravel 5.5 или ниже. В версии 5.6 или выше вы можете отправить экземпляр Response методу прерывания.

Dees Oomens 04.04.2019 09:00

Я использую люмен! Последняя версия! :)

Ahmad Mobaraki 04.04.2019 09:02

Может быть, попытаться переопределить метод прерывания в пользовательском файле помощников? Я разместил ссылку на код в своем ответе выше.

Dees Oomens 04.04.2019 09:12

Вы можете сгенерировать (настраиваемое) исключение и обработать исключение в myFunc();

  public function myFunc()
  {
       try {
           $this->checkExistence();
           // do other stuff
       } catch (\My\Namespace\ExistenceException $e) {
           //Handle error
           return response(404);
       }
  }  

  /**
  * @throws \My\Namespace\ExistenceException
  */
  private function checkExistence(): void
  {
      if (!$this->myVar){
        throw new \My\Namespace\ExistenceException;
      }
  }

Спасибо Даан за ответ, я ищу более чистый код, могу ли я перенести функцию try...catch в checkExistence? и просто вызвать checkExistence() в myFunc ?

Ahmad Mobaraki 17.04.2019 11:43

И могу ли я ответить json после того, как произойдет исключение?

Ahmad Mobaraki 17.04.2019 11:44

Лучшим и самым простым для вас было бы предложение else в вашем частном методе. Код после оператора return не запускается, поэтому в вашем случае обязательно «else». Кроме того, попробуйте ввести свой $myVar в свой конструктор.

    public function __construct($myVar)
     {
        //assign here as you've done
     }

Я бы рекомендовал не возвращать ответ в вашем методе checkExistence(). Вместо этого я бы хотел, чтобы этот метод возвращал true или false и возвращал ответ в myFunc():

public function myFunc(){
    if (this->checkExistence()) {
        return response(404);
        // Or better yet, use: `abort(404);`
    }
    // do other stuff
}  

private function checkExistence(){
    return !$this->myVar;
}

вы не хотите проверять, является ли переменная ложной (которая в PHP включает в себя bool (false) и NULL, пустую строку и несуществующее свойство, пустой массив и бог знает что еще), вы хотите проверить, существует ли свойство , правильно? в этом случае используйте property_exists, например

  private function checkExistence(){
      if (!property_exists($this,'myVar'){
        return response(404);
      }
  }

Другие вопросы по теме