9.Laravel5学习笔记:在laravel中注册自己的服务到容器中

问题描述



也许标题写的不够清楚,实际情况是,在我使用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 [email protected] 。不胜感激,谢谢!!!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 07:02:35

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

9.Laravel5学习笔记:在laravel中注冊自己的服务到容器中

问题描写叙述 或许标题写的不够清楚.实际情况是,在我使用laravel的过程中.须要将自己的一个类,通过服务提供者注冊到IOC容器中,可是在实际操作过程中.出现了下面错误: Unresolvable dependency resolving [Parameter #0 [ <required> $name ]] 意思就是说.我的注冊东西,不能够进行类型转换. 我的代码中没有进行代码说明须要的类型. 代码情况 代码主要实现的一个功能是,对传入的字符串进行AES加密. 本来Laravel自身是提供

OD调试学习笔记7—去除未注册版软件的使用次数限制

OD调试学习笔记7—去除未注册版软件的使用次数限制 本节使用的软件链接 (想自己试验下的可以下载) 一:破解的思路 仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制.那么我们就可以逆向的来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等.也就是说,程序的代码的走法也会跟未注册的时候截然不同.因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化. 二:认识OD的两种断点

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

简介 在 Laravel5 中,本身已经提供了丰富的验证规则供我们使用,但是天下应用奇葩多,做为程序员你会发现永远都有新的验证规则诞生,光是组合已经拯救不了你的项目了.这个时候就需要我们扩展 Validator 类,来使之帮助项目继续健康向前发展. 官方给了多种扩展 Validator 的方式,我独爱直接扩展该类,但是关于这一点,官文中又写的寥寥数语,确实新人有些无奈.这里详细说一下,如何扩展它. 扩展验证类 首先,扩展的收个问题是,我的扩展类应该放在哪儿才好呢?我的意见是:直接在app目录下,

学习笔记:Oracle dul数据挖掘 使用DUL数据恢复软件恢复分区表中

使用Oracle dul数据恢复工具对Oracle数据库分区表中的数据进行恢复 创建SALES分区表案例 CREATE TABLE SALES ( PRODUCT_ID VARCHAR2(5), SALES_DATE DATE, SALES_COST NUMBER(10), STATUS VARCHAR2(20) ) PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS) SUBPARTITION TEMPLATE ( SUBPA

C++ Primer 学习笔记_11_标准模板库_stack、queue队列容器与priority_queue优先队列容器

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

8. Laravel5学习笔记:在laravel5中使用OAuth授权

OAuth2.0简介 关于它的介绍,给出以下两篇文章,相信看完,应该对它有一定程度的了解: [1] 理解OAuth 2.0 -- 阮一峰 [2] 帮你深入理解OAuth2.0协议 -- seccloud 这里我主要阐述的是在laravel5中使用OAuth2.0.关于这个协议本身,以及运行流程希望大家看完以上两篇文章,理解后,再看我后面的内容! Laravel5中安装OAuth2.0 OAuth2.0在官方中提供了 php的库 ,但是我们这里并不直接使用它官方提供的 Server Librari

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

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

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

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

【Java学习笔记之二十】final关键字在Java继承中的用法小结

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类   当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用final