Ошибка PHP-функции и шаблон успеха

Каков наилучший способ возврата ошибок из функции 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" ); } } });