Position actuelle: Accueil> Derniers articles> Comment encapsuler att_get en utilisant dans laravel

Comment encapsuler att_get en utilisant dans laravel

M66 2025-05-22

Lorsque vous utilisez Laravel pour le développement de PHP, le framework utilise ELOWENT ORM et PDO pour les opérations de base de données par défaut. Cependant, dans certains scénarios, pour des raisons de compatibilité ou de performance, les développeurs peuvent utiliser directement les fonctions fournies par l'extension MySQLI pour interagir avec la base de données. MySQLI_STMT :: ATTR_GET est une méthode de la classe MySQLI_STMT qui est utilisée pour obtenir des propriétés d'instruction, ce qui est très utile lors du débogage ou de la gestion granulaire du comportement de connexion de la base de données.

Afin d'utiliser plus commodément MySQLI_STMT :: ATTR_GET dans les projets Laravel, nous pouvons le encapsuler et gérer uniformément les connexions de la base de données et le traitement des instructions. Voici le schéma d'emballage spécifique et les étapes de mise en œuvre.

1. Créez une classe de service de base de données personnalisée

Tout d'abord, nous pouvons créer une classe de service dans le projet Laravel pour encapsuler les opérations MySQLI natives, telles que MySQLiservice .

Créez le fichier mysqliservice.php dans le répertoire des applications / services :

 <?php

namespace App\Services;

class MysqliService
{
    protected $mysqli;

    public function __construct()
    {
        $this->connect();
    }

    protected function connect()
    {
        $this->mysqli = new \mysqli(
            env('DB_HOST', 'localhost'),
            env('DB_USERNAME', 'root'),
            env('DB_PASSWORD', ''),
            env('DB_DATABASE', 'forge'),
            env('DB_PORT', 3306)
        );

        if ($this->mysqli->connect_error) {
            throw new \Exception('Connect Error (' . $this->mysqli->connect_errno . ') ' . $this->mysqli->connect_error);
        }
    }

    public function prepare($query)
    {
        $stmt = $this->mysqli->prepare($query);
        if (!$stmt) {
            throw new \Exception('Prepare failed: ' . $this->mysqli->error);
        }
        return $stmt;
    }

    public function getStatementAttribute($stmt, int $attr)
    {
        if (!($stmt instanceof \mysqli_stmt)) {
            throw new \InvalidArgumentException('Invalid statement object provided.');
        }

        return $stmt->attr_get($attr);
    }

    public function close()
    {
        if ($this->mysqli) {
            $this->mysqli->close();
        }
    }
}

2. Enregistrer la liaison du conteneur de service

Afin d'utiliser MySQLiservice dans les contrôleurs ou d'autres classes, la liaison de service peut être effectuée dans AppServiceProvider .

Modifier l'application / les fournisseurs / appserviceprovider.php :

 use App\Services\MysqliService;

public function register()
{
    $this->app->singleton(MysqliService::class, function ($app) {
        return new MysqliService();
    });
}

3. Méthodes d'utilisation de l'emballage dans le contrôleur

Maintenant, nous pouvons utiliser MySQLiservice directement dans le contrôleur et appeler la méthode GetStatementAtTribute pour obtenir les attributs de l'instruction.

L'exemple de code est le suivant:

 use App\Services\MysqliService;

class DatabaseController extends Controller
{
    protected $mysqliService;

    public function __construct(MysqliService $mysqliService)
    {
        $this->mysqliService = $mysqliService;
    }

    public function showAttribute()
    {
        $stmt = $this->mysqliService->prepare("SELECT * FROM users WHERE email = ?");
        $stmt->bind_param("s", $email);
        $email = "test@m66.net";

        $stmt->execute();

        // Supposons que nous voulons obtenir MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH propriété
        $attrValue = $this->mysqliService->getStatementAttribute($stmt, MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);

        $stmt->close();
        $this->mysqliService->close();

        return response()->json(['attribute_value' => $attrValue]);
    }
}

4. Choses à noter

  • ATTR_GET est une méthode relativement rarement utilisée de MySQLI_STMT , et tous les environnements PHP n'activent pas cette méthode d'extension par défaut. Sa disponibilité doit être confirmée avant le déploiement.

  • Si vous utilisez des opérations MySQLI natives dans Laravel, il est recommandé de le résumer en tant que couche de service et d'envisager de l'exploitation et de la gestion des exceptions pour assurer la robustesse du système.

  • Bien que MySQLI ait des capacités de contrôle de niveau inférieur dans certains scénarios, le constructeur éloquent et de requête de Laravel fournit des abstractions de niveau supérieur qui conviennent plus au développement quotidien dans la plupart des cas.

Grâce à la méthode d'encapsulation ci-dessus, nous pouvons appeler élégamment mysqli_stmt :: att_get dans Laravel pour réaliser une gestion centralisée des connexions de base de données et des attributs d'instruction, ce qui rend le code plus clair et plus maintenable.