这就是 Laravel 容器派上用场的地方。如果您不喜欢核心组件的功能,那么您可以轻松地覆盖它。
首先您需要创建自己的 PasswordBroker:
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\PasswordBroker as IlluminatePasswordBroker;
class PasswordBroker extends IlluminatePasswordBroker
{
public function emailResetLink()
{
$view = $this->emailView;
return $this->mailer->queue($view, compact('token', 'user'), function ($m) use ($user, $token, $callback) {
$m->to($user->getEmailForPasswordReset());
if (! is_null($callback)) {
call_user_func($callback, $m, $user, $token);
}
});
}
}
如果您想将命名空间放在应用中的其他位置,请将其更改为您想要的任何名称。
由于注册服务的服务提供者是deferred service provider,您需要创建自己的提供者来替换它。可能最简单的方法是扩展Illuminate\Auth\Passwords\PasswordResetServiceProvider,如下所示:
namespace App\Providers;
use App\Auth\Passwords\PasswordBroker;
class PasswordResetServiceProvider extends \Illuminate\Auth\Passwords\PasswordResetServiceProvider
{
protected function registerPasswordBroker()
{
$this->app->singleton('auth.password', function ($app) {
$tokens = $app['auth.password.tokens'];
$users = $app['auth']->driver()->getProvider();
$view = $app['config']['auth.password.email'];
return new PasswordBroker(
$tokens, $users, $app['mailer'], $view
);
});
}
}
最后在您的config/app.php 文件中删除Illuminate\Auth\Passwords\PasswordResetServiceProvider::class 并将App\Providers\PasswordResetServiceProvider::class 添加到您的'providers' 数组中。
Laravel 现在将使用您的 PasswordBroker 实现,而不是现有的框架,您不必担心修改框架代码。