Напоминание пароля Laravel 4: проблема перенаправления

Я использую функцию напоминания пароля Laravel 4, как описано здесь: http://four.laravel.com/docs/security#password-reminders-and-reset. Чтобы сгенерировать токен, отправить электронное письмо и создать запись в БД в таблице password_reminder, я использую стандартный код в файле маршрутов:

Route::post('password/remind', function() {
  $credentials = array('email' => Input::get('email'));
  return Password::remind($credentials);
});

Предполагается, что этот код отправляет меня обратно к моей форме ввода в случае какой-либо ошибки (например, неизвестный адрес электронной почты). Вместо этого я получаю MethodNotAllowedHttpException. Причина в том, что Laravel не пытается отправить меня обратно на мой URL-адрес формы (который равен /password/forgot): он пытается перенаправить меня на /password/remind в GET, и этот маршрут не существует (конечно) в моем файле route.php.

Я проверил код класса Illuminate\Auth\Reminders\PasswordBroker, который отвечает за это перенаправление, и обнаружил этот метод:

protected function makeErrorRedirect($reason = '')
{
  if ($reason != '') $reason = 'reminders.'.$reason;
  return $this->redirect->refresh()->with('error', true)->with('reason', $reason);
}

Я заменил $this->redirect->refresh() на $this->redirect->back(), и теперь все работает как раньше. Но так как я нигде не нашел комментариев по этому багу, я предполагаю, что делаю что-то не так… Но я не могу найти что!

Вот мой файл route.php:

Route::get('password/forgot', array('as' => 'forgot', 'uses' => 'SessionsController@forgot'));
Route::post('password/remind', function() {
    $credentials = array('email' => Input::get('email'));
    return Password::remind($credentials);
});
Route::get('password/reset/{token}', function($token) {
    return View::make('sessions.reset')->with('token', $token);
});
Route::post('password/reset/{token}', array('as' => 'reset', 'uses' => 'SessionsController@reset'));

мой соответствующий код SessionsController:

class SessionsController extends BaseController {

    [...]

    public function forgot() {
        return View::make('sessions.forgot');
    }

    public function reset() {
        $credentials = array(
            'email' => Input::get('email'),
            'password' => Input::get('password'),
            'password_confirmation' => Input::get('password_confirmation')
        );

        Input::flash();

        return Password::reset($credentials, function($user, $password) {
            $user->password = Hash::make($password);            
            $user->save();
            return Redirect::to('home');
        });
    }

}

и, наконец, мой код просмотра:

{{ Form::open(array('url' => 'password/remind', 'class' => 'form', 'role' => 'form', 'method'=>'post')) }}
    <div class="form-group">
        {{ Form::label('email', 'E-mail') }}
        {{ Form::text('email', '', array('autocomplete'=>'off', 'class' => 'form-control')) }}
    </div>
    {{ Form::submit("Envoyer", array("class"=>"btn btn-primary")) }}
{{ Form::close() }}

person Philippe    schedule 27.11.2013    source источник
comment
Немного погуглив, я нашел это: cultt.com/ 2013/09/23/password-reminders-reset-laravel-4 В первых комментариях они получают ту же ошибку. Кто-то сказал, что перенос маршрутов с замыканий на контроллеры решил проблему. Может быть, вы могли бы попробовать это и посмотреть, что произойдет.   -  person Manuel Pedrera    schedule 27.11.2013
comment
@ManuelPedrera Спасибо за совет. Я пробовал так, безуспешно…   -  person Philippe    schedule 28.11.2013


Ответы (1)


Если это возможно, я настоятельно рекомендую вам перейти на Laravel 4.1, потому что он поставляется с более гибким (также более простым для понимания и работы) решением для напоминания/сброса пароля.

Посмотрите этот пример с Laravel 4.1:

https://github.com/laracasts/Laravel-4.1-Password-Resets/blob/master/app/controllers/RemindersController.php

person Tamás Pap    schedule 11.12.2013