使用EloquentUserProvider与不同的Hasher - Contextual Binding

时间:2016-02-04 07:50:20

标签: php laravel hash laravel-5

我正在开发一个拥有旧用户数据库的项目。我必须编写自己的Hasher类(实现" Illuminate \ Contracts \ Hashing \ Hasher")以生成和检查现有的哈希值。这部分相当简单,运作良好。

我遇到的麻烦是得到了#EloquentUserProvider"使用我的Hasher实现而不是默认的" BcryptHasher"。

在这种情况下,Contextual Binding看起来很理想,但是我找不到很多正在使用的例子,所以我真的在黑暗中采取刺。

关于如何保持默认" BcryptHasher"的任何想法对于一般的哈希职责(例如Hash::make()),同时强迫" EloquentUserProvider"使用我的Hasher课程?

这是我到目前为止(在" config / app.php"中注册为提供者):

namespace App\Providers;

class LegacyHashServiceProvider extends \Illuminate\Hashing\HashServiceProvider
{
    public function register()
    {
        $this->app->when('Illuminate\Auth\EloquentUserProvider')
            ->needs('Illuminate\Contracts\Hashing\Hasher')
            ->give('App\Classes\LegacyHash');
    }
}

我得到的错误是:

ReflectionException in Container.php line 741:
Class hash does not exist

1.  in Container.php line 741
2.  at ReflectionClass->__construct('hash') in Container.php line 741
3.  at Container->build('hash', array()) in Container.php line 631
4.  at Container->make('hash', array()) in Application.php line 674
5.  at Application->make('hash') in Container.php line 1163
6.  at Container->offsetGet('hash') in AuthManager.php line 105
7.  at AuthManager->createEloquentProvider() in AuthManager.php line 91
8.  at AuthManager->createEloquentDriver() in Manager.php line 87
9.  at Manager->createDriver('eloquent') in AuthManager.php line 18
10. at AuthManager->createDriver('eloquent') in Manager.php line 63
...

看起来很简单,但我很困惑。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

作为我的问题的后续内容。

经过多次尝试才能实现这一点,我得出结论,Laravel从服务容器中预先构建了一个“哈希”对象,并将其注入“EloquentUserProvider”。它没有使用类型提示来注入依赖性,因此Contextual Binding可能不会起作用。

最后,我基本上将Laravel的默认哈希提供程序换成了我自己的哈希提供程序。我调整了我的“LegacyHashServiceProvider”并将其绑定到服务容器中的“哈希”键。最后,我在config / app.php文件中注释了Laravel的默认哈希提供程序,并为我的“LegacyHashServiceProvider”添加了一个条目。

我认为Contextual Binding会更加优雅,只要它能够起作用。

这是我的“LegacyHashServiceProvider”

中的代码
NULL