Вот псевдокод того, что я хочу сделать:
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, потому что возвращает всю функцию, которая имеет смысл!
Как мне передать эту проверку существования в приватную функцию!?
где вы вызываете эту функцию?
Если вы хотите вернуть туда ответ 404, вы можете использовать метод прервать().
@DanyalSandeelo Я вызываю это в функции myFunc. взгляните на мой второй псевдокод.
@DeesOomens, ты прав. Но на самом деле я хочу вернуть ответ json с кодом 404. Обновлю вопрос






Если вы хотите вернуть ответ где-то за пределами контроллера, вы всегда можете использовать метод 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);
И он работает хорошо и возвращает исключение HTTP, но когда я помещаю этот код в приватную функцию, он не работает.
Что вы имеете в виду под не работает? Это не ответ JSON?
public function myFunc(){ RETURN $this->checkExistence(); } И checkExistense() верните все, что вам нужно.
@DeesOomens Извините, забыл удалить return из myFunct, теперь все работает, но abort принимает int только для первого аргумента, а для второго принимает string, ОШИБКА: Object of class Illuminate\Http\JsonResponse could not be converted to int
Теперь проблема в том, как abort и вернуть json одновременно.
Ах, вы используете Laravel 5.5 или ниже. В версии 5.6 или выше вы можете отправить экземпляр Response методу прерывания.
Я использую люмен! Последняя версия! :)
Может быть, попытаться переопределить метод прерывания в пользовательском файле помощников? Я разместил ссылку на код в своем ответе выше.
Вы можете сгенерировать (настраиваемое) исключение и обработать исключение в 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 ?
И могу ли я ответить json после того, как произойдет исключение?
Лучшим и самым простым для вас было бы предложение 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);
}
}
попробуйте if ($this->checkExistence()){...}else{...}