浅谈lumen的自定义依赖注入

网络编程 PHP编程 php实例 分类:[default] 更新日期: 2017-01-28
下面小编就为大家带来一篇浅谈lumen的自定义依赖注入。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

比如我现在有个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的自定义依赖注入就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!

相关文章
  • 利用ASP.NETMVC和Bootstrap快速搭建响应式个人博客站(一)
    利用ASP.NETMVC和Bootstrap快速搭建响应式个人博客站(一)
    这篇文章主要介绍了利用ASP.NET MVC和Bootstrap快速搭建响应式个人博客站一的相关资料,需要的朋友可以参考下1.0 为什么要做这个博客站? 在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个书签时,可能就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效. ...
  • 解读ASP.NET5&MVC6系列教程1:ASP.NET5简介
    这篇文章主要介绍ASP.NET 5简介以及对各个版本号进行解释,ASP.NET 5中新的变化,需要的朋友可以参考下.ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一个.NET Core的东西. 在.NET C ...
  • PHP微信开发之查询微信精选文章
    这篇文章主要为大家详细介绍了PHP微信开发之简单实现查询微信精选文章的相关资料,感兴趣的小伙伴们可以参考一下查询微信里的一些精选的,点击量比较大的文章. 别忘记申请apikey(登录百度账号即可获取),要完成的功能是: 1.用户回复"文章",公众号要返回文章分类的编号(比如9.科技). 2.用户回复wz9,1,腾讯     则能返回科技类 ...
  • Linux上安装Python的PIL和Pillow库处理图片的实例教程
    这里我们来看一下在Linux上安装Python的PIL和Pillow库处理图片的实例教程,包括一个使用Pillow库实现批量转换图片的例子:安装正常情况,只需 pip install PIL==1.1.7 或者 pip install Pillow==2.9.0 即可.但需留意安装后的输出安装完成后,需留意输出: *** TKINTER support no ...
  • 利用ASP.NETMVC+Bootstrap搭建个人博客之打造清新分页Helper三
    利用ASP.NETMVC+Bootstrap搭建个人博客之打造清新分页Helper三
    这篇文章主要介绍了利用ASP.NET MVC+Bootstrap搭建个人博客之打造清新分页Helper三的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下0. 没有找到一款中意的分页插件,又不想使用现成的(丑到爆),所以自己动手造一个吧 先看下效果(其实也不咋滴...): 我的小站地址:我的Bootstrap小站; PS:(问博客园:为什么老是删我 ...
  • 利用ASP.NETMVC+Bootstrap搭建个人博客之praise.js点赞特效插件(二)
    这篇文章主要介绍了利用ASP.NET和MVC+Bootstrap搭建个人博客之praise.js点赞特效插件二的相关资料,需要的朋友可以参考下在上篇文章给大家介绍了利用ASP.NET MVC和Bootstrap快速搭建响应式个人博客站(一).接下来给大家介绍如果做个点赞插件,一起通过本文学习吧! 1. 为啥要做这个点赞插件?    praise.js是一款小 ...
猜你喜欢