13

有谁知道如何覆盖 laravel 密码代理中使用的功能?我知道文档:

https://laravel.com/docs/5.3/passwords#resetting-views

提供有关如何处理诸如视图和一些表面级别的事情的信息,但实际上根本不清楚,或者我可能没有阅读足够多的时间。

我已经知道如何覆盖ResetsPasswords.phpTrait,但覆盖的Password::broker()是下一层的功能。

如果需要更多信息,我可以提供一些。

先感谢您。

4

2 回答 2

32

我不得不面对同样的问题,需要重写一些 PasswordBroker 函数。经过对网络的大量调查和许多失败的尝试,我最终实现了以下实现:

  1. 在 App\Providers 中创建了一个CustomPasswordResetServiceProvider ,我在其中注册了一个CustomPasswordBrokerManager实例。

    namespace App\Providers;
    use Illuminate\Support\ServiceProvider;
    use App\Services\CustomPasswordBrokerManager; 
    class CustomPasswordResetServiceProvider extends ServiceProvider{
        protected $defer = true;
    
        public function register()
        {
            $this->registerPasswordBrokerManager();
        }
    
        protected function registerPasswordBrokerManager()
        {
            $this->app->singleton('auth.password', function ($app) {
                return new CustomPasswordBrokerManager($app);
            });
        }
    
        public function provides()
        {
            return ['auth.password'];
        }
    }
    
  2. config/app.php 中注释掉 line:
    //Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    并添加:
    App\Providers\CustomPasswordResetServiceProvider::class,

  3. 在 App\Services 文件夹中创建了一个CustomPasswordBrokerManager并复制了位于以下位置的默认PasswordBrokerManager
    的上下文: Illuminate\Auth\Passwords\PasswordBrokerManager.php
    然后修改了函数解析以返回我的CustomPasswordProvider类的实例。

    protected function resolve($name)
    {
        $config = $this->getConfig($name);
        if (is_null($config)) {
            throw new InvalidArgumentException("Password resetter [{$name}] is not defined.");
        }
    
        return new CustomPasswordBroker(
            $this->createTokenRepository($config),
            $this->app['auth']->createUserProvider($config['provider'])
    );
    }
    
  4. 最后,在 App\Services 文件夹中,我创建了一个CustomPasswordBroker类,它扩展了位于Illuminate\Auth\Passwords\PasswordBroker 的默认PasswordBroker
    并覆盖了我需要的函数。

    use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker;    
    
    class CustomPasswordBroker extends BasePasswordBroker    
    {    
    // override the functions that you need here    
    }      
    

不确定这是否是最好的实现,但它对我有用。

于 2017-03-17T11:09:08.437 回答
6

答案https://stackoverflow.com/a/42855948/2311074中的第 1 步和第 3 步缺少一些内容

步骤1

可能最安全的方法是简单地将类从Illuminate\Auth\Passwords\PassswordResetServiceProvider.phpto复制App\Provider\CustomPasswordResetServiceProvider并更改:

  1. 命名空间namespace App\Providers;
  2. 类名CustomPasswordResetServiceProvider
  3. 添加use App\Services\CustomPasswordBrokerManager;到顶部
  4. 函数内部registerPasswordBroker重命名 PasswordBrokerManagerCustomPasswordBrokerManager

第2步。

除了更改解析方法外,还可以执行以下操作:

  1. 将命名空间更改为namespace App\Services;
  2. 添加use Illuminate\Auth\Passwords\DatabaseTokenRepository;到顶部
  3. 将班级名称更改为CustomPasswordBrokerManager
于 2018-06-20T12:02:47.840 回答