Transactions à Laravel

Susan Sarandon
Libérer: 2024-10-22 08:07:02
original
416 Les gens l'ont consulté

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");
   }
}
Copier après la connexion

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");
     }
 }
Copier après la connexion

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;
});
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!