【问题标题】:Laravel reset email redirectionLaravel 重置电子邮件重定向
【发布时间】:2018-08-29 21:02:14
【问题描述】:

在我的项目中,我有一个页面来处理登录表单、注册表单和密码重置表单。

对于前两个,一切正常。最后,我找到了一种发送自己的电子邮件而不是 laravel 的默认电子邮件的方法,但现在我想在成功时停止重定向。

对于这个故事,当我点击提交时,我会启动一个 sweetalert 通知,使用 Ajax 调用重置控制器并等待响应。

但是,页面会在成功时重新加载。我找不到阻止重定向的方法,只是将 json 发送到我的 Ajax。

我的 login.js :

$(".m_login_forget_password_submit").click(function(l){

    var t=$(this),r=$(this).closest("form");
    t.addClass("m-loader m-loader--right m-loader--light");

    swal({
        title:"Mot de passe",
        text:"Génération du lien.",
        type:"info"
    });
        var $this = $(this);
        $.ajax({
            type: 'POST',
            url: 'password/request',
            data: $this.serializeArray(),
            success:function(data){
                $("#m_login_signup_submit").toggleClass("m-loader m-loader--right m-loader--light");
                swal({
                    title:"Succès",
                    text:"Votre demande de compte a été transmise à nos équipe.",
                    type:"success"
                });

            },
            error: function(data){
                $("#m_login_signup_submit").toggleClass("m-loader m-loader--right m-loader--light");
                if( data.status === 422 ) {
                    var error = "Les erreurs suivantes ont été trouvées :";
                    var errors = data.responseJSON;
                    $.each( errors, function( key, value ) {
                        error += '<br>&#9656 ' + value[0];
                    });
                    swal("Erreur",error,"error")
                }
            }
        });

我的自定义 ResetPasswordController :

class ResetPasswordController extends Controller

{

use ResetsPasswords;

/**
 * Where to redirect users after resetting their password.
 *
 * @var string
 */
protected $redirectTo = '/home';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest');
}

/**
 * Get the response for a successful password reset.
 *
 * @param  string  $response
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
 */
protected function sendResetResponse($response)
{
    return 'ok';
}


    }

有人知道如何防止在发送电子邮件重置密码成功时重定向并改为发送 json 吗?

感谢您的帮助。

【问题讨论】:

  • 你使用的是什么版本的 Laravel?
  • 我使用 5.6 版的 laravel

标签: laravel


【解决方案1】:

重置密码时,reset 函数将在您的 ResetPasswordController 中调用,因此您必须将您的 sendResetResponse 函数重命名为 reset(因为您想覆盖 trait 函数)并指向未使用函数的默认特征函数。另外,如果您需要 JSON 响应,则需要在返回时指定它。

例子:

class ResetPasswordController extends Controller
{
    use ResetsPasswords {
        reset as unused;
    }

    ...

    //Override the trait function
    public function reset(Request $request) {
        //Call default validation and handle password change

        $this->validate($request, $this->rules(), $this->validationErrorMessages());

        // Here we will attempt to reset the user's password. If it is successful we
        // will update the password on an actual user model and persist it to the
        // database. Otherwise we will parse the error and return the response.
        $response = $this->broker()->reset(
            $this->credentials($request), function ($user, $password) {
                $this->resetPassword($user, $password);
            }
        );

        //Return the response
        if ($response == Password::PASSWORD_RESET) {
            return response()->json(array(
                'result' => 'ok',
            ), 200);
        } else {
            return response()->json(array(
                'result' => 'fail',
            ), 500);
        }
    }
}

编辑:

抱歉,您以为您在谈论重置密码重定向。要在发送电子邮件后处理重定向,您将采用类似的方法并修改您的 ForgotPasswordController 并覆盖 sendResetLinkEmail 函数:

class ForgotPasswordController extends Controller
{
    use SendsPasswordResetEmails {
        sendResetLinkEmail as unused;
    }

    ...

    public function sendResetLinkEmail(Request $request)
    {
        $this->validateEmail($request);

        $response = $this->broker()->sendResetLink(
            $request->only('email')
        );

        //Return the response
        if ($response == Password::RESET_LINK_SENT) {
            return response()->json(array(
                'result' => 'ok',
            ), 200);
        } else {
            return response()->json(array(
                'result' => 'fail',
            ), 500);
    }
    }
}

【讨论】:

  • 我的 Ajax 触发密码/请求和密码/电子邮件也被触发。最后,我没有像以前那样重定向到 /login,而是重定向到密码/电子邮件,我看到了纯文本的 json。
  • 我认为存在混淆。我需要避免重定向“发送重置电子邮件”而不是“重置密码”。答案还是一样?
  • 我有临时标题,并且在登录页面重新加载后:/
  • 验证您的路线是否正确(例如php artisan route:list)。尽管默认路由是 password/email,但您的 ajax 调用会发送到 password/request。控制器功能应该是App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail
  • 好的!这是我纠正的问题:从表单标签中删除操作/从表单中删除正确的序列化数据。感谢您的帮助
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 2019-08-05
  • 2011-01-18
  • 2019-07-02
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多