Arhn - архитектура программирования

Зачем возвращать void, если оператор return никогда не достигается?

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

Копаясь в коде, связанном с этим другим вопросом, я нашел странное утверждение return, которое я не понимаю. Прежде чем перейти к моему вопросу, взгляните на эти два фрагмента кода из кода laravel/framework.

Черта \Illuminate\Foundation\Auth \AuthenticatesUsers:

/**
 * Handle a login request to the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
 *
 * @throws \Illuminate\Validation\ValidationException
 */
public function login(Request $request)
{
    $this->validateLogin($request);

    // If the class is using the ThrottlesLogins trait, we can automatically throttle
    // the login attempts for this application. We'll key this by the username and
    // the IP address of the client making these requests into this application.
    if ($this->hasTooManyLoginAttempts($request)) {
        $this->fireLockoutEvent($request);

        return $this->sendLockoutResponse($request);
    }

    if ($this->attemptLogin($request)) {
        return $this->sendLoginResponse($request);
    }

    // If the login attempt was unsuccessful we will increment the number of attempts
    // to login and redirect the user back to the login form. Of course, when this
    // user surpasses their maximum number of attempts they will get locked out.
    $this->incrementLoginAttempts($request);

    return $this->sendFailedLoginResponse($request);
}

Черта \Illuminate\Foundation\Auth \ThrottlesLogins:

/**
 * Redirect the user after determining they are locked out.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 * @throws \Illuminate\Validation\ValidationException
 */
protected function sendLockoutResponse(Request $request)
{
    $seconds = $this->limiter()->availableIn(
        $this->throttleKey($request)
    );
    throw ValidationException::withMessages([
        $this->username() => [Lang::get('auth.throttle', ['seconds' => $seconds])],
    ])->status(429);
}

В признаке AuthenticatesUsers проверяется, было ли предпринято слишком много попыток аутентификации для данного пользователя. Если это так, запускается событие и возвращается ответ блокировки. Все идет нормально.

Чего я не понимаю, так это оператора return перед $this->sendLockoutResponse($request). Данный метод всегда генерирует исключение и ничего не возвращает (ну, он вернул бы void, но это не так, потому что он всегда throws).

Итак, какова цель оператора return здесь? Является ли это подсказкой для читателя, что login() отменяется в этот момент, или это какой-то особый синтаксис, о котором я никогда раньше не слышал?


  • У меня нет окончательного ответа, но я думаю, что это нужно для предотвращения необходимости изменения кода login(), если что-то изменится в sendLockoutResponse(). Это позволяет вам переписать sendLockoutResponse() и вместо этого вернуть ответ. 13.05.2018
  • Мне любопытно, есть ли окончательный ответ или просто @taylorotwell дает нам пищу для размышлений. Но мне нравится твоя идея о ремонтопригодности! 13.05.2018
  • Аналогичный здесь 13.05.2018
  • Я думаю, что он немного отличается, потому что return помещается в тот же метод. Здесь объяснение @devk не сработает. 13.05.2018

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..