web-dev-qa-db-ja.com

Laravel 5.3パスワードブローカーのカスタマイズ

Laravelのパスワードブローカー内で使用される関数をオーバーライドする方法を知っている人はいますか?私はドキュメントを知っています:

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

ビューやいくつかの表面レベルのものなどについて何をすべきかについての情報を提供しますが、それは実際にはまったく明確ではないか、おそらく私はそれを十分に読んでいません。

_ResetsPasswords.php_トレイトをオーバーライドする方法はすでに知っていますが、Password::broker()の機能をオーバーライドするのはの次のレイヤーです。

さらに必要な情報があれば、親切に提供できます。

前もって感謝します。

12
Andre F.

私は同じ問題に直面しなければならず、PasswordBroker関数のいくつかをオーバーライドする必要がありました。 Webで多くの調査を行い、多くの試みが失敗した後、私は次の実装に行き着きました。

  1. CustomPasswordResetServiceProviderをApp\Providers内に作成しました。ここで、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    
    }      
    

これが最良の実装であるかどうかはわかりませんが、私にとってはうまくいきました。

28
KoKa

答えのステップ1と3にはいくつか欠けているものがあります https://stackoverflow.com/a/42855948/2311074

ステップ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に変更します
5
Adam