Laravel 5.3密码代理定制

时间:2016-11-10 16:19:03

标签: php laravel laravel-5 laravel-authorization laravel-mail

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

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

提供有关如何为视图和一些表面层次的事情做些什么的信息,但它根本不是很清楚,或者我可能没有阅读足够多次。

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

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

提前谢谢。

2 个答案:

答案 0 :(得分:21)

我不得不面对同样的问题,需要覆盖一些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 中注明掉了一行:
    //Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    并补充说:
    App\Providers\CustomPasswordResetServiceProvider::class,

  3. 在App \ Services文件夹中创建了一个 CustomPasswordBrokerManager 并复制了位于以下位置的默认 PasswordBrokerManager 的上下文 照亮\验证\密码\ 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 类,该类扩展了位于以下位置的默认 PasswordBroker : 照亮\ Auth \ Passwords \ PasswordBroker并覆盖我需要的功能。

    use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker;    
    
    class CustomPasswordBroker extends BasePasswordBroker    
    {    
    // override the functions that you need here    
    }      
    
  5. 不确定这是否是最好的实施方式,但它对我有用。

答案 1 :(得分:2)

答案https://stackoverflow.com/a/42855948/2311074

中的步骤1和3缺少一些内容

第1步

可能最安全的方法是将类从Illuminate\Auth\Passwords\PassswordResetServiceProvider.php复制到App\Provider\CustomPasswordResetServiceProvider并进行更改:

  1. 命名空间为namespace App\Providers;
  2. 类别名称为CustomPasswordResetServiceProvider
  3. 在顶部添加use App\Services\CustomPasswordBrokerManager;
  4. 在函数registerPasswordBroker中将PasswordBrokerManager重命名为CustomPasswordBrokerManager

第2步。

除了更改resolve方法之外,还请执行以下操作:

  1. 将命名空间更改为namespace App\Services;
  2. 在顶部添加use Illuminate\Auth\Passwords\DatabaseTokenRepository;
  3. 将类名称更改为CustomPasswordBrokerManager