国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

淺談lumen的自定義依賴注入

2024-05-04 23:59:42
字體:
供稿:網(wǎng)友

比如我現(xiàn)在有個token認證系統(tǒng),目前我用mysql的token表實現(xiàn),將來有可能會改成redis,怎么實現(xiàn)未來的無縫連接呢。

先定義一個合約文件app/Contracts/TokenHandler.php

<?php  namespace App/Contracts;  /**  * 處理Token的Contracts  * @package App/Contracts  */interface TokenHandler {  /**   * 創(chuàng)建一個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個方法:創(chuàng)建token,得到token對應(yīng)用戶,刪除token。

然后我們寫一個Mysql下的實現(xiàn)app/Services/MysqlTokenHandler.php

<?php  namespace App/Services;  use App/Contracts/TokenHandler; use App/Orm/Token;  /**  * 處理Token的Contracts對應(yīng)的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里綁定兩者的映射關(guān)系:

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

如果將來換成了redis,只要重新寫一個RedisTokenHandler的實現(xiàn)并重新綁定即可,具體的業(yè)務(wù)邏輯代碼不需要任何改變。

于是在controller里就可以直接注入該對象實例,只要在參數(shù)前聲明合約類型:

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的自定義依賴注入就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網(wǎng)。

 

注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 延川县| 苍南县| 永安市| 新昌县| 额济纳旗| 固始县| 吴桥县| 济阳县| 五指山市| 大宁县| 翼城县| 友谊县| 体育| 东兰县| 中西区| 常宁市| 胶州市| 汽车| 安福县| 乐亭县| 濮阳市| 惠州市| 徐汇区| 武冈市| 习水县| 金昌市| 类乌齐县| 门头沟区| 陈巴尔虎旗| 甘孜县| 乳源| 息烽县| 浦江县| 福海县| 西宁市| 汕尾市| 凤山市| 河北省| 怀来县| 阜新| 海林市|