For example, I now have a token authentication system. Currently, I use mysql token table to implement it. It may be changed to redis in the future. How can I achieve seamless connections in the future?
First define a contract file app/Contracts/TokenHandler.php
Copy after login
Three methods are defined here: create token, get the user corresponding to the token, and delete token.
Then we write an implementation app/Services/MysqlTokenHandler.php under Mysql
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(); } }
Then Bind the mapping relationship between the two in bootstrap/app.php:
##
$app->singleton( App\Contracts\TokenHandler::class, App\Services\MysqlTokenHandler::class);
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'));
The above is the detailed content of Introduction to custom dependency injection examples of lumen in php. For more information, please follow other related articles on the PHP Chinese website!