Laravel 5.1错误的Illuminate \ Encryption \ Encrypter实例

时间:2015-12-22 13:30:02

标签: php laravel dependency-injection namespaces laravel-5.1

我有一个类,我试图用依赖注入交换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');

任何帮助表示感谢。

2 个答案:

答案 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按预期工作。