Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion über die benutzerdefinierte Abhängigkeitsinjektion des Lumen-Frameworks

Eine kurze Diskussion über die benutzerdefinierte Abhängigkeitsinjektion des Lumen-Frameworks

*文
*文Original
2018-01-03 16:09:141807Durchsuche

In diesem Artikel geht es hauptsächlich um die benutzerdefinierte Abhängigkeitsinjektion des Lumen-Frameworks. Der Herausgeber findet es ziemlich gut, daher möchte ich es heute als Referenz mit Ihnen teilen. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen. Ich hoffe, es wird für alle hilfreich sein.

Zum Beispiel verwende ich derzeit ein Token-Authentifizierungssystem, um es in Zukunft zu implementieren. Wie kann ich in Zukunft nahtlose Verbindungen herstellen?

Definieren Sie zunächst eine Vertragsdatei 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); 
}

Hier sind 3 Methoden definiert: Token erstellen, abrufen Das Token entspricht dem Benutzer. Löschen Sie das Token.

Dann schreiben wir eine Implementierung app/Services/MysqlTokenHandler.php unter 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(); 
 } 
}

Dann binden wir die Zuordnungsbeziehung zwischen den beiden in bootstrap/app.php:

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

Wenn Sie in Zukunft zu Redis wechseln, müssen Sie nur die Implementierung von RedisTokenHandler neu schreiben und neu binden. Der spezifische Geschäftslogikcode muss nicht geändert werden.

Sie können also die Objektinstanz direkt in den Controller einfügen, solange Sie den Vertragstyp vor den Parametern deklarieren:

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;)); 
 } 
}

Sie können die Instanz des injizierten Objekts auch manuell abrufen im Code, wie zum Beispiel:

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

Verwandte Empfehlungen:

Verwenden von Laravel's Queue

Laravel schreibt APP-Schnittstelle (API)

Erkunden Sie, wie die Middleware von Laravel implementiert wird

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über die benutzerdefinierte Abhängigkeitsinjektion des Lumen-Frameworks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn