我正在开发一个拥有旧用户数据库的项目。我必须编写自己的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
...
看起来很简单,但我很困惑。有什么想法吗?
答案 0 :(得分:0)
作为我的问题的后续内容。
经过多次尝试才能实现这一点,我得出结论,Laravel从服务容器中预先构建了一个“哈希”对象,并将其注入“EloquentUserProvider”。它没有使用类型提示来注入依赖性,因此Contextual Binding可能不会起作用。
最后,我基本上将Laravel的默认哈希提供程序换成了我自己的哈希提供程序。我调整了我的“LegacyHashServiceProvider”并将其绑定到服务容器中的“哈希”键。最后,我在config / app.php文件中注释了Laravel的默认哈希提供程序,并为我的“LegacyHashServiceProvider”添加了一个条目。
我认为Contextual Binding会更加优雅,只要它能够起作用。
这是我的“LegacyHashServiceProvider”
中的代码NULL