Transaction Middleware for Laravel is a simple package that provides a middleware to wrap DELETE requests in a database transaction. This means that if an error occurs during a DELETE request, any database changes will be rolled back automatically, ensuring data integrity.
Version: 1.0.6
-
DB Transaction on DELETE Requests: Wraps only DELETE method requests in a database transaction. If an exception is thrown during request processing, the transaction is rolled back.
-
Flexible Auto-application: Control how the middleware is applied via configuration:
auto_apply_global— Apply automatically to global middleware.auto_apply_web— Apply automatically to the web group only.auto_apply_api— Apply automatically to the api group only.
-
Manual Attachment: Even if you choose not to auto-apply, the middleware is available via its alias (
transaction) for manual attachment on routes. -
Laravel Auto-Discovery: The package uses Laravel’s auto-discovery so you don’t need to manually register the service provider.
- PHP ^8.0
- Laravel 9.x, 10.x, 11.x or 12.x (or higher)
Install via Composer:
composer require azmolla/transaction-middlewareLaravel will automatically discover the service provider. If you need to publish the configuration file, run:
php artisan vendor:publish --tag=transaction-middleware-configThis will copy the configuration file to your Laravel application’s config directory as transaction-middleware.php.
The published config file (config/transaction-middleware.php) looks like this:
<?php
return [
'auto_apply_global' => false,
'auto_apply_web' => false,
'auto_apply_api' => false,
];-
Auto-application Mode: If you set
auto_apply_web_apitotrue, the service provider will automatically push the middleware to both the web and api middleware groups. -
Selective Auto-application: Alternatively, you can set only one of the other two options (
auto_apply_weborauto_apply_api) totrueto have the middleware applied only to that particular group. -
Manual Mode: With all auto-apply options set to
false, you must manually attach the middleware to your routes using the aliastransaction.
After publishing the config file, edit it as needed:
-
To add the middleware to both groups:
'auto_apply_global' => true, 'auto_apply_web' => false, 'auto_apply_api' => false,
-
To add it only to the web group:
'auto_apply_global' => false, 'auto_apply_web' => true, 'auto_apply_api' => false,
-
To add it only to the API group:
'auto_apply_global' => false, 'auto_apply_web' => false, 'auto_apply_api' => true,
In these modes, you don’t need to add the middleware manually; it will automatically be pushed into the appropriate middleware groups.
If you prefer to control where the middleware is applied, leave all auto-apply options as false. Then, attach the middleware to your routes like so:
Route::delete('/posts/{post}', [PostController::class, 'destroy'])
->middleware('transaction');The easiest will be to use the \Azmolla\TransactionMiddleware\Traits\HasTransactionCalls trait which adds a transaction() method.
use Azmolla\TransactionMiddleware\Traits\HasTransactionalCalls;
class MyModel
{
use HasTransactionalCalls;
}You can call the transaction() without any argument and the method after will be called in a transaction.
This example will call the delete() method in a transaction.
This is useful if you have any listeners also running database queries, like deleting child models.
The transaction will prevent you from corrupted data if any of the queries fails.
$model->transaction()->delete();If you want you can also pass a callback to the transaction() method you will get the calling object as first argument.
$model->transaction(function(Model $model) {
$model->update();
$model->child->update();
});-
Middleware Logic: The middleware checks if the request is a DELETE method. If so, it starts a DB transaction using
DB::beginTransaction(). The request is then passed along the middleware pipeline. If the request processing completes without error,DB::commit()is called. In case of an exception,DB::rollBack()is executed, and the exception is rethrown. -
Service Provider: The
TransactionMiddlewareServiceProvidermerges your package’s configuration with the application config, publishes the config file for customization, and conditionally pushes the middleware into the appropriate groups based on the configuration values. -
Laravel Auto-discovery: Thanks to the
extrablock in the composer.json, Laravel auto-discovers and registers the service provider, so there’s no manual configuration required inconfig/app.php. -
Trait Usage: You can use the
\Azmolla\TransactionMiddleware\Traits\HasTransactionCallstrait to add atransaction()method to your models.
Contributions are welcome! Feel free to fork the repository and open a pull request. Please follow the established coding standards and include tests for new features or bug fixes.
This package is open-sourced software licensed under the MIT license.
Version 1.0.6
- Support for Laravel ^12
Version 1.0.5
- Add a trait and class to call methods in a database transaction.
Version 1.0.4
- update 'auto_apply_web_api' to 'auto_apply_global'
Version 1.0.3
- update readme.md
- update composer.json
Version 1.0.2
- update readme.md
Version 1.0.1
- updated composer.json
Version 1.0.0
- Initial release of Transaction Middleware for Laravel.
- Provides DB transaction wrapping for DELETE requests.
- Configurable auto-application to web and/or API middleware groups.
Happy coding and thanks for using Transaction Middleware for Laravel! If you have questions or run into issues, feel free to open an issue on GitHub.