Une brève discussion sur l'injection de dépendances personnalisée du framework Lumen

*文
Libérer: 2023-03-19 08:32:01
original
1817 Les gens l'ont consulté

Cet article parle principalement de l'injection de dépendances personnalisées du framework Lumen. L'éditeur pense que c'est plutôt bien, j'aimerais donc le partager avec vous aujourd'hui pour votre référence. Suivons l'éditeur pour y jeter un œil, j'espère que cela sera utile à tout le monde.

Par exemple, j'ai actuellement un système d'authentification par jeton. Actuellement, j'utilise la table de jetons mysql pour l'implémenter. Elle pourrait être modifiée en redis à l'avenir.

Définissez d'abord un fichier de contrat 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); 
}
Copier après la connexion

Il y a 3 méthodes définies ici : créer un jeton, obtenir Le token correspond à l'utilisateur, supprimez le token.

Ensuite, nous écrivons une implémentation app/Services/MysqlTokenHandler.php sous Mysql

<?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(&#39;user_id&#39;, $userId)->count() >= $this->userTokensMax) { 
   Token::where(&#39;user_id&#39;, $userId)->orderBy(&#39;updated_at&#39;, &#39;asc&#39;)->first()->delete(); 
  } 
 
  $token = \Illuminate\Support\Str::random(32); 
  if (!Token::create([&#39;token&#39; => $token, &#39;user_id&#39; => $userId])) { 
   return false; 
  } 
 
  return $token; 
 } 
 
 /** 
  * @inheritdoc 
  */
 public function getTokenUser($token) 
 { 
  $tokenObject = Token::where(&#39;token&#39;, $token)->first(); 
 
  return $tokenObject && $tokenObject->user ? $tokenObject->user : false; 
 } 
 
 /** 
  * @inheritdoc 
  */
 public function removeToken($token) 
 { 
  return Token::find($token)->delete(); 
 } 
}
Copier après la connexion

Ensuite, lions la relation de mappage entre les deux dans bootstrap/app.php :

$app->singleton(
 App\Contracts\TokenHandler::class,
 App\Services\MysqlTokenHandler::class
);
Copier après la connexion

Si vous passez à Redis à l'avenir, il vous suffit de réécrire l'implémentation de RedisTokenHandler et de la relier. Le code de logique métier spécifique n'a pas besoin d'être modifié.

Vous pouvez donc injecter directement l'instance de l'objet dans le contrôleur, à condition de déclarer le type de contrat avant les paramètres :

public function logout(Request $request, TokenHandler $tokenHandler) 
{ 
 if ($tokenHandler->removeToken($request->input(&#39;api_token&#39;))) { 
  return $this->success([]); 
 } else { 
  return $this->error(Lang::get(&#39;messages.logout_fail&#39;)); 
 } 
}
Copier après la connexion

Vous pouvez également récupérer manuellement l'instance de l'objet injecté dans le code, tels que :

$currentUser = app(\App\Contracts\TokenHandler::class)->getTokenUser($request->input(&#39;api_token&#39;));
Copier après la connexion

Recommandations associées :

Utilisation de la file d'attente de Laravel

Laravel écrit une interface APP (API)

Explorez comment le middleware de Laravel est implémenté

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal