Einführung in benutzerdefinierte Beispiele für die Abhängigkeitsinjektion von Lumen in PHP

黄舟
Freigeben: 2023-03-15 14:18:01
Original
1457 Leute haben es durchsucht

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);
}
Nach dem Login kopieren

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(&#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();
    }
}
Nach dem Login kopieren

Binden Sie dann die Zuordnungsbeziehung zwischen den beiden in bootstrap/app.php:


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

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(&#39;api_token&#39;))) {
            return $this->success([]);
        } else {
            return $this->error(Lang::get(&#39;messages.logout_fail&#39;));
        }
    }
Nach dem Login kopieren

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(&#39;api_token&#39;));
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage