Здесь находится спасательный контейнер 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, а не базу данных, и вам не придется беспокоиться о модификации кода рамки.
Спасибо @ marcus.ramsden за ваш вклад. Я следил за вашим подходом, но я не могу понять, почему он не работает. Я не ошибаюсь. Кажется, что он по-прежнему вызывает 'emailResetLink' родительского класса вместо перезаписанного. –
Извините, моя ошибка на примере в регистрационной части вашего поставщика услуг, которая должна быть '$ this-> app-> singleton' вместо' $ this-> app-> bind'.Также основным поставщиком услуг, регистрирующим вещи, является [отложенный поставщик] (http://laravel.com/docs/master/providers#deferred-providers). Через мгновение я кое-что обновлю. –
Еще раз спасибо за ваш ввод. '$ this-> app-> singleton' тоже не делает этого. Все еще вызов родительского метода. –