Maison >développement back-end >tutoriel php >Transactions à 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 :
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!