Laravel,我该如何覆盖供应商的代码

时间:2019-05-24 14:11:40

标签: php laravel

Laravel 5.1具有以下代码:

public function postEmail(Request $request)
{
    $this->validate($request, ['email' => 'required|email']);

    $response = Password::sendResetLink($request->only('email'), function (Message $message) {
        $message->subject($this->getEmailSubject());
    });

    switch ($response) {
        case Password::RESET_LINK_SENT:
            return redirect()->back()->with('status', trans($response));/*I HAVE TO CHANGE THIS*/
        case Password::INVALID_USER:
            return redirect()->back()->withErrors(['email' => trans($response)]);
    }
}

该代码来自特征: app\vendor\laravel\framework\src\Illuminate\Foundation\Auth\ResetsPasswords.php

我需要用其他代码更改带有注释的行:

return redirect()->route('login')->with(['message' => 'Se ha enviado a su email el link del reseteo, por favor verifique.',]);

但这是供应商文件。我怎样才能做到这一点?覆盖另一个文件中的方法?在哪里?

2 个答案:

答案 0 :(得分:1)

一个稍微有点棘手的解决方案是复制您需要编辑的类,然后将其与原始名称空间和类名一起放在smartphonebrand中。然后添加到composer.json:

somedir/fixed_class.php

不过,最好还是以某种方式尝试扩展类并使用自己的改进版本(或为原始的composer模块提交错误修正/功能请求)。

答案 1 :(得分:0)

back()函数将检查请求中的referer标头,因此您可以编写将其更改为url(route('login'))的中间件。

如果未设置该标头,则可以调用$request->setPreviousUrl(url(route('login')));

所以基本上您的中间件代码可以是这样的

public function handle($request, Closure $next) {
    if (/* request is the reset password */) {
        if ($request->headers->has('referer')) {
            $request->headers->set('referer', url(route('login')));
        } else {
            $request->setPreviousUrl(url(route('login')));
        }

    }
}