【问题标题】:Laravel 5.3 Password Broker CustomizationLaravel 5.3 密码代理自定义
【发布时间】:2017-03-24 18:11:57
【问题描述】:

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

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

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

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

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    我不得不面对同样的问题,需要重写一些 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 的上下文:
      Illuminate\Auth\Passwords\PasswordBrokerManager.php
      然后修改函数 resolve 以返回我的 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
      Illuminate\Auth\Passwords\PasswordBroker 并覆盖了我需要的函数。

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

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

    【讨论】:

    • 这是我最终做的一个非常相似的实现。很好地解释了对目录和所有内容的识别。 +1 并标记为正确!
    • 只需更改密码重置所需的密码长度。 6 个字符的最小长度在 laravel 代码中埋得很深,所以我只能在这里用你的答案来改变它。非常感谢!
    • 谢谢你。我被这个 Password Broker 和 Password Broker Manager 搞得一团糟。说真的,我无法理解他们如何以如此糟糕的方式复杂化过去很简单的事情。此外,对于在 Laravel 5.4 上执行此操作的人,服务提供者的 register 方法与此处显示的方法略有不同。本质上,registerPasswordBroker 方法应该在 Illuminate\Auth\Passwords\PasswordResetServiceProvider 上按原样复制,除了您使用自己的自定义 CustomPasswordBrokerManager 实例的部分。
    • 非常感谢,对我帮助很大!
    【解决方案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. 函数内部registerPasswordBrokerPasswordBrokerManager重命名为CustomPasswordBrokerManager

    第 2 步。

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      相关资源
      最近更新 更多