Maison  >  Article  >  développement back-end  >  Introduction aux exemples d'injection de dépendances personnalisés de lumen en php

Introduction aux exemples d'injection de dépendances personnalisés de lumen en php

黄舟
黄舟original
2017-08-23 09:51:171454parcourir

Par exemple, j'ai actuellement un système d'authentification par jeton. Actuellement, j'utilise la table des 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);
}

Trois méthodes sont définies ici : créer un token et obtenir l'utilisateur correspondant à le jeton, supprimez le jeton.

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

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


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

Si vous la modifiez dans l'avenir Pour devenir redis, 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é.

Ensuite l'instance d'objet peut être directement injectée dans le contrôleur, à condition que le type de contrat soit déclaré 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;));
        }
    }

Vous pouvez également manuellement dans le code Obtenez une instance de l'objet injecté, telle que :


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

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!

Déclaration:
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