问题描写叙述


或许标题写的不够清楚。实际情况是,在我使用laravel的过程中。须要将自己的一个类,通过服务提供者注冊到IOC容器中,可是在实际操作过程中。出现了下面错误:

Unresolvable dependency resolving [Parameter #0 [ <required> $name ]]

意思就是说。我的注冊东西,不能够进行类型转换。

我的代码中没有进行代码说明须要的类型。

代码情况


代码主要实现的一个功能是,对传入的字符串进行AES加密。

本来Laravel自身是提供了的,可是因为我须要与Android、IOS进行三个平台的统一。因此仅仅能自己又一次提供一个能够在三个平台间相互转化的AES加密。

代码大体结构是,一个 interface

<?

php

namespace App\Libary\Contracts\Encryption;

use Illuminate\Contracts\Encryption\Encrypter;
/**
*
*
* @desc 扩展接口。添加了设置key的接口
* @date 2015年7月15日
*/
interface EncrypterInterface extends Encrypter
{
/**
*
* 设置加密、解密的key
* @param string $key
*/
public function setKey($key);
}

这个接口是继承自Laravel的核心接口。

仅仅是扩展了一个方法

一个实现类 :

<?php

namespace App\Libary\Encryption;

use App\Libary\Contracts\Encryption\EncrypterInterface;
use RuntimeException;
/**
*
* @desc 使用AES进行加解密
* @date 2015年7月15日
*/
class AesCrypt implements EncrypterInterface
{
protected $hex_iv = 'xxxxxxx'; protected $key; public function __construct($key)
{
//
} public function encrypt($str)
{
//
} public function decrypt($payload)
{
//
} public function setKey($key)
{
//
}
}

这个类实现了上面的接口,然后要提供一个服务提供者。将这个服务注冊到IOC中去。

服务提供者代码:

<?php

namespace App\Libary\Encryption;

use Illuminate\Support\ServiceProvider;
use App\Libary\Encryption\AesCrypt; class AesServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('App\Libary\Contracts\Encryption\EncrypterInterface', function($app){
$config = $app->make('config')->get('app'); $key = $config['key']; return new AesCrypt($key);
});
}
}

然后在一个控制器中调用,假设。控制器名称叫做 : TestController。代码例如以下:

public function aes(AesCrypt $aes)
{
$payload = $aes->encrypt('hello world!'); echo $payload , '<br />';
echo $aes->decrypt($payload);
}

假设此时执行。这会触发 BindingResolutionException 这个异常。报错例如以下:

Unresolvable dependency resolving [Parameter #0 [ <required> $key ]] in class App\Libary\Encryption\AesCrypt

提示说,我这个必须的參数$key。在进行容器绑定的时候。不知道该传入一个什么类型。

那么要解决问题。就须要告诉IOC容器,你须要给我绑定一个什么依赖的类型进来就OK了。

我这里明显须要的是一个字符串。所以能够通过下面两种方案解决

方案一:更改 AesCrypt 类的构造函数

这个错误因为是未限制构造函数须要的类型,因此,能够直接先明白它的类型。可做例如以下更改

// 请注意,这里默认给它的构造函数设置了一个空字符串,那么在进行绑定时,就能够检查到这里须要传入一个字符串
public function __construct($key='')
{
//
}

方案二:使用接口进行调用 (推荐方法)

在进行測试的时候。我直接使用了实现类。事实上这是不好的,写接口的目的,本来就是为了减少依赖,减小耦合。所以有接口。干嘛不用接口呢?

这里须要改的地方是在控制器中。

// 请注意,这里传入的參数限制类型已经变换为接口了
public function aes(EncrypterInterface $aes)
{
$payload = $aes->encrypt('hello world'); echo $payload , '<br />';
echo $aes->decrypt($payload);
}

思考


尽管问题得到了解决。可是我的疑惑并未全然消除。在我使用过程中,laravel自身的加密函数 Illuminate\Encryption\Encrypter 它的构造函数并未指定其类型。它构造函数例如以下:

// 并未对$key进行赋空字符串
public function __construct($key, $cipher = 'AES-128-CBC')
{
//
}

再使用中。也不一定非要使用接口才干够。

全然能够直接使用这个类,也不会刚刚上面的绑定类型的错误。

翻看了源代码,也未找到问题所在。因为如今项目时间比較紧,也仅仅能临时使用 方案二 来解决我遇到的问题了。

假设有同学遇到过这个问题、有更好的解决方式,欢迎留言或email helei5200@126.com

不胜感激,谢谢。!


Laravel5专题文件夹

9.Laravel5学习笔记:在laravel中注冊自己的服务到容器中的更多相关文章

  1. 11.Laravel5学习笔记:扩展 Validator 类

    简单介绍 在 Laravel5 中,本身已经提供了丰富的验证规则供我们使用,可是天下应用奇葩多,做为程序猿你会发现永远都有新的验证规则诞生,光是组合已经解救不了你的项目了.这个时候就须要我们扩展 Va ...

  2. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

  5. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

    目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...

  6. 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常

    目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...

  7. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  8. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  9. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

随机推荐

  1. 谈谈你对java的理解

    这个题目是考察多个方面 但是要回答出关键点: 1.平台无关性 2.GC 3.语言特性.泛型.反射.lamda 4.面向对象 5.类库 6.异常处理

  2. Openjudge-4151-电影节

    这个题是一道贪心的题目,我们要想看的电影数目最多,我们肯定每次都要选最早结束的电影,这样我们才能去看下一部电影. 它本身最早结束,如果同时开始,那肯定是它的放映时间比较短,如果它后开始,先结束,那它的 ...

  3. [LUOGU] P4290 [BZOJ] 1055 [HAOI2008]玩具取名

    题目描述 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WING"中任意两个字母代 ...

  4. 为公司内部搭建CA

    步骤一 首先我们要知道CA的配置文件 openssl的配置文件:/etc/pki/tls/openssl.cnf 我们打开这个配置文件 这文件中很多跟CA相关的信息如图 解释: 我们可以搭建好几个CA ...

  5. transformer模型解读

    最近在关注谷歌发布关于BERT模型,它是以Transformer的双向编码器表示.顺便回顾了<Attention is all you need>这篇文章主要讲解Transformer编码 ...

  6. 在不使用ssr的情况下解决Vue单页面SEO问题

    遇到的问题: 近来在写个人博客的时候遇到了大家可能都会遇到的问题 Vue单页面在SEO时显得很无力,尤其是百度不会抓取动态脚本 Vue-Router配合前后端分离无法让meta标签在蜘蛛抓取时动态填充 ...

  7. python基础知识03-格式化输出和深浅复制

    VIM中HJKL可以上下左右移动光标. 格式化输出和深浅复制 1.字符串的拼接和格式化 sudo pip3 install ipython 安装 ipython 进入 字符串相加 str1 + str ...

  8. SpringBoot log4j2 异常

    log4j 配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  9. UVALive - 6267 Beer Pressure

    题意: 给定n个酒吧, 然后有k个学生投票今晚去哪个酒吧, 然后会有a个(a<=k)学生先投票了, 先投的票会影响后面的人投票的概率, 求每个酒吧今晚去的概率. 分析: 我们可以从最初的状态开始 ...

  10. SQLServer__问题记录

    “备份集中的数据库备份与现有的xx数据库不同”  参考链接: http://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html RESTOR ...