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 werden drei Methoden definiert: Token erstellen und den entsprechenden Benutzer abrufen das Token, 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('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(); } }
Binden Sie dann die Zuordnungsbeziehung zwischen den beiden in bootstrap/app.php:
$app->singleton( App\Contracts\TokenHandler::class, App\Services\MysqlTokenHandler::class);
Wenn Sie es ändern Die Zukunft Um Redis zu werden, müssen Sie nur die Implementierung von RedisTokenHandler neu schreiben und neu binden. Der spezifische Geschäftslogikcode muss nicht geändert werden.
Dann kann die Objektinstanz direkt in den Controller eingefügt werden, solange der Vertragstyp vor den Parametern deklariert wird:
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')); } }
Das ist möglich auch manuell im Code Holen Sie sich eine Instanz des injizierten Objekts, wie zum Beispiel:
$currentUser = app(\App\Contracts\TokenHandler::class)->getTokenUser($request->input('api_token'));
Das obige ist der detaillierte Inhalt vonEinführung in benutzerdefinierte Beispiele für die Abhängigkeitsinjektion von Lumen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!