比如我现在有个token认证系统,目前我用mysql的token表实现,将来有可能会改成redis,怎么实现未来的无缝连接呢。

先定义一个合约文件app/Contracts/TokenHandler.php

<?php 
 
namespace App\Contracts; 
 
/** 
 * 处理Token的Contracts 
 * @package App\Contracts 
 */
interface TokenHandler 
{ 
 /** 
  * 创建一个token 
  * @param $userId integer 用户Id 
  * @return string 
  */
 public function createToken($userId); 
 
 /** 
  * 得到该token的用户 
  * @param $token string token值 
  * @return \App\User 拥有该token的用户 
  */
 public function getTokenUser($token); 
 
 /** 
  * 删除一个token 
  * @param $token string token值 
  * @return bool 是否成功 
  */
 public function removeToken($token); 
}

这里定义了3个方法:创建token,得到token对应用户,删除token。

然后我们写一个Mysql下的实现app/Services/MysqlTokenHandler.php

<?php 
 
namespace App\Services; 
 
use App\Contracts\TokenHandler; 
use App\Orm\Token; 
 
/** 
 * 处理Token的Contracts对应的Mysql Service 
 * @package App\Services 
 */
class MysqlTokenHandler implements TokenHandler 
{ 
 /** 
  * @var int 一个用户能够拥有的token最大值 
  */
 protected $userTokensMax = 10; 
 
 /** 
  * @inheritdoc 
  */
 public function createToken($userId) 
 { 
  while (Token::where('user_id', $userId)->count() >= $this->userTokensMax) { 
   Token::where('user_id', $userId)->orderBy('updated_at', 'asc')->first()->delete(); 
  } 
 
  $token = \Illuminate\Support\Str::random(32); 
  if (!Token::create(['token' => $token, 'user_id' => $userId])) { 
   return false; 
  } 
 
  return $token; 
 } 
 
 /** 
  * @inheritdoc 
  */
 public function getTokenUser($token) 
 { 
  $tokenObject = Token::where('token', $token)->first(); 
 
  return $tokenObject && $tokenObject->user ? $tokenObject->user : false; 
 } 
 
 /** 
  * @inheritdoc 
  */
 public function removeToken($token) 
 { 
  return Token::find($token)->delete(); 
 } 
}

然后在bootstrap/app.php里绑定两者的映射关系:

$app->singleton(
 App\Contracts\TokenHandler::class,
 App\Services\MysqlTokenHandler::class
); 

如果将来换成了redis,只要重新写一个RedisTokenHandler的实现并重新绑定即可,具体的业务逻辑代码不需要任何改变。

于是在controller里就可以直接注入该对象实例,只要在参数前声明合约类型:

public function logout(Request $request, TokenHandler $tokenHandler) 
{ 
 if ($tokenHandler->removeToken($request->input('api_token'))) { 
  return $this->success([]); 
 } else { 
  return $this->error(Lang::get('messages.logout_fail')); 
 } 
} 

也可以在代码里手动得到注入对象的实例,比如:

$currentUser = app(\App\Contracts\TokenHandler::class)->getTokenUser($request->input('api_token')); 


以上这篇浅谈lumen的自定义依赖注入就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持Devmax。

浅谈lumen的自定义依赖注入的更多相关文章

  1. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. Angular 4依赖注入学习教程之ValueProvider的使用(七)

    这篇文章主要给大家介绍了关于Angular 4依赖注入之ValueProvider使用的相关资料,文中介绍的非常详细,对大家学习或者使用Angular4具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

  3. element-table如何实现自定义表格排序

    这篇文章主要介绍了element-table如何实现自定义表格排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. vue如何自定义地址设置@

    这篇文章主要介绍了vue如何自定义地址设置@,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. SpringBoot实现自定义事件的方法详解

    这篇文章将用实例来和大家介绍一下如何在SpringBoot中自定义事件来使用观察者模式。文中的示例代码讲解详细,对我们学习SpringBoot有一定的帮助,需要的可以参考一下

  6. PHP经典设计模式之依赖注入定义与用法详解

    这篇文章主要介绍了PHP经典设计模式之依赖注入,结合实例形式分析了php依赖注入的定义、原理与用法,需要的朋友可以参考下

  7. React Native 中添加自定义字体的方法

    这篇文章主要介绍了如何在 React Native 中添加自定义字体,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. Android 自定义View手写签名并保存图片功能

    这篇文章主要介绍了Android 自定义View手写签名并保存图片功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下

  9. Spring Cloud超详细i讲解Feign自定义配置与使用

    这篇文章主要介绍了SpringCloud Feign自定义配置与使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. 利用Android实现比较炫酷的自定义View

    自定义View、多线程、网络,被认为是Android开发者必须牢固掌握的最基础的三大基本功,这篇文章主要给大家介绍了关于如何利用Android实现比较炫酷的自定义View的相关资料,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部