Maison  >  Article  >  développement back-end  >  Transactions à Laravel

Transactions à Laravel

Susan Sarandon
Susan Sarandonoriginal
2024-10-22 08:07:02421parcourir

Transacciones en laravel

Dans certaines occasions, nous devons réaliser une série d'opérations consécutives, et il est essentiel qu'elles soient toutes réalisées avec succès, sans qu'aucune ne soit laissée à moitié.

Un exemple courant est la création d'un utilisateur, où il est essentiel que des rôles soient également attribués et qu'un e-mail d'inscription soit envoyé.

Pour gérer ce type de situations, des transactions sont utilisées. Voici une méthode qui crée un utilisateur, attribue le rôle, puis envoie un e-mail via la méthode sendEmail(). Cette méthode reçoit l'e-mail comme argument et l'envoie en conséquence.

use Illuminate\Support\Facades\DB;

public function save(array $data)
{
    try {
           $user = User::create($data);

           $user->syncRoles([$data['role']]);

           $this->sendEmail([
                'email' => $data['email'],
           ]);

            return $user;
   } catch (\Exception $e) {
          throw new BadRequestException("Error al guardar nuevo usuario");
   }
}

Il faut appliquer 3 méthodes :

  • DB::beginTransaction(); Démarrer une transaction
  • DB::commit(); Confirmez les modifications
  • DB::rollback(); Si une opération ne peut pas être effectuée, toutes les modifications seront annulées et l'état sera le même qu'avant le début de la transaction.

Implémentation des transactions dans le code précédent, il nous reste :

use Illuminate\Support\Facades\DB;

public function save(array $data)
{
     // Iniciar la transacción
     DB::beginTransaction();
     try {

        $user = User::create($data);

        $user->syncRoles([$data['role']]);

        $this->sendEmail([
             'email' => $data['email'],
        ]);

        // Confirmo la transacción
        DB::commit();

        return $user;
     } catch (\Exception $e) {
        // Si falla hago rollback
        DB::rollback();

        throw new BadRequestException("Error al guardar nuevo usuario");
     }
 }

Grâce à cela, nous nous assurons que l'ensemble des opérations est exécuté complètement ou pas du tout.

Laravel fournit également une autre méthode de transaction plus concrète de la façade DB. Dans ce cas, la validation et la restauration se font automatiquement. Ceci est recommandé lorsque le nombre d'opérations est faible ou ne nécessite pas d'opérations supplémentaires avant d'effectuer la restauration

DB::transaction(function () use($data){

  $user = User::create($data);

  $user->syncRoles([$data['role']]);

  $this->sendEmail([
      'email' => $data['email'],
  ]);

  return $user;
});

Important : Considérations sur le moteur de base de données
Tous les moteurs de stockage ne prennent pas en charge les transactions. InnoDB est un moteur qui prend en charge les transactions, contrairement à MyISAM. Il est essentiel de s'assurer que les tables de votre base de données utilisent un moteur qui prend en charge les transactions pour qu'elles fonctionnent correctement.

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