Как проверить существование переменной частной функцией в классе php? - PullRequest
1 голос
/ 04 апреля 2019

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

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, потому что он возвращает всю функцию, которая имеет смысл!

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

Ответы [ 6 ]

3 голосов
/ 04 апреля 2019

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

Функция прерывания генерирует исключение HTTP, которое будет обработано обработчиком исключений.

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

abort(response()->json([], 404));
2 голосов
/ 17 апреля 2019

Вы можете выдать (пользовательское) исключение и обработать исключение в 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;
      }
  }
1 голос
/ 17 апреля 2019

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

    public function __construct($myVar)
     {
        //assign here as you've done
     }
0 голосов
/ 18 апреля 2019

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

  private function checkExistence(){
      if(!property_exists($this,'myVar'){
        return response(404);
      }
  }
0 голосов
/ 18 апреля 2019

Я бы рекомендовал не возвращать ответ в вашем 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;
}
0 голосов
/ 12 апреля 2019

Вы должны установить $ myVar:

 protected  $myVar = null;

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

после этого изменения в функции checkExistence ()

private function checkExistence(){

    if(empty($this->myVar))
       abort(404, "myVar is empty"); //set your http code and message

}

вы можете использовать его в своих функциях, например так:

 public function myFunc(){

      $this->checkExistence(); //check myVar 
     // do other stuff
 }

теперь настроил ваш App \ Exceptions \ Handler.php и настроил функцию рендеринга, чтобы получить ответ в json:

//add http exception class
use Symfony\Component\HttpKernel\Exception\HttpException;

затем обработайте исключение в функции рендеринга:

public function render($request, Exception $e)
{ 
   if($e instanceof HttpException){
        return $this->responseJson($e->getStatusCode(), $e->getMessage());
        return response()->json(["code" => $e->getStatusCode(), "message"=>$e->getMessage()], $e->getStatusCode());
    }

   return parent::render($request, $e);
}   
...