Каков наилучший способ возврата ошибок из функции PHP, когда функция выполняется нормально?
пример
public function login($user, $pw){ if(!$this->verifyUser($user)) // return error about invalid user } else if (!$this->verifyPw($pw)){ // return error about invalid pw } else { // return OK } }
Caller – возвращает ответ как JSON для веб-интерфейса
public function doLogin($user,$pw){ $res = $this->login($user, $pw); return json_encode($res); }
С одной стороны, я мог понять, как возвращать результаты как массив, но я чувствую, что это не имеет смысла для таких функций низкого уровня. Возможно, они должны возвращать коды ошибок, а затем вызывающий должен искать строку кода ошибки?
Предполагая, что вы находитесь в объекте, у вас есть три основных варианта:
$this->errors
и возвращать false
$this->collector->addError('blah blah');
и вернуть false
Для первых двух подходов вам нужно будет проверить возвращаемое значение и на основе этого вывести список ошибок. Но оба этих варианта имеют преимущество в сборе нескольких ошибок.
Исходный подход немного легче при соединении, но вы можете получить только одну ошибку.
Что касается того, что на самом деле вернуть, я бы рекомендовал перейти с кодом ошибки + описание строки. Но эта строка не будет возвращена вашим классом. Вместо этого ваша ошибка должна быть зарегистрирована с использованием некоторого «заполнителя», который позже переводится:
$this->errors[] = [ 'code' => 52, 'msg' => 'authentication.login.invalid-password', ];
Когда вы вытаскиваете ошибки из своего объекта, это будет в основном список записей, подобных этому, и затем вы просто запускаете их через свою службу перевода.
В случае исключения эта же информация будет находиться в $e->getCode()
и $e->getMessage()
, когда ваш объект выдает исключение InvalidPassword
.
Для ответа API ответ от tereško будет соответствовать правильным строкам.
Для ответа DOM вы можете сделать следующее:
Я использовал код ответа только в прошлом для чего-то такого простого:
http://php.net/manual/en/function.http-response-code.php с кодом 401
public function login($user, $pw) { header_remove(); # Clear all previous headers. if( !$this->verifyUser($user) || !$this->verifyPw($pw) ){ http_response_code(401); exit; } http_response_code(200); exit; }
JQuery:
$.ajax({ ....... statusCode: { 200: function() { window.location.href = '/'; }, 401: function() { alert( "Login Failed" ); } } });