我有一个类,我试图用依赖注入交换Crypt :: encrypt的外观用法:
<?php namespace App\Libraries;
use Illuminate\Encryption\Encrypter;
class MyClass
{
public function __construct(Encrypter $encrypter)
{
$this->encrypter= $encrypter;
}
public function myMethod()
{
$this->encrypter->crypt('somevalue');
}
}
错误的实例正在实例化:
传递给App \ Libraries \ MyClass :: __ construct()的参数1必须是 Illuminate \ Encryption \ Encrypter的实例,实例 Illuminate \ Encryption \ McryptEncrypter给出
立面解决没有问题,但我想了解为什么DI失败。
use Illuminate\Support\Facades\Crypt;
Crypt::encrypt('somevalue');
任何帮助表示感谢。
答案 0 :(得分:2)
这是因为您注册了McryptEncrypter
而不是Encrypter
。
如果您有不受支持的密码或密钥,则可能是这样。
有关详细信息,请查看Illuminate\Encryption\EncryptionServiceProvider
。
use Illuminate\Contracts\Encryption\Encrypter;
class MyClass
{
public function __construct(Encrypter $encrypter)
{
$this->encrypter= $encrypter;
}
public function myMethod()
{
$this->encrypter->crypt('somevalue');
}
}
另外,请遵循SOLI D 原则Depend upon Abstractions. Do not depend upon concretions.
将Encrypter具体实现替换为接口。
立面解决没有问题,但我想了解为什么DI失败。
Facade有效,因为他只是解析了你注册的内容,在你的情况下是McryptEncrypter
希望它会有所帮助。
答案 1 :(得分:0)
Laravel Encrypter
界面 的FQCN(由我突出显示)是:
Illuminate\Contracts\Encryption\Encrypter
您定义的方法:
public function __construct(Encrypter $encrypter)
{
$this->encrypter= $encrypter;
}
没有使用该界面。除非您没有使用正确的界面,否则PHP将正确且完全正确地向您显示错误消息,并且幸运地阻止您的程序运行:
传递给App \ Libraries \ MyClass :: __ construct()的参数1必须是Illuminate \ Encryption \ Encrypter的实例,Illuminate \ Encryption \ McryptEncrypter的实例给出
你违反了合同!
为参数使用正确的接口,以便DI按预期工作。