rajentrivedi / transaction-x
轻松实现数据库事务
1.0.0
2023-11-24 09:51 UTC
Requires
- php: ^8.1
- illuminate/contracts: ^10.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.8
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^8.8
- pestphp/pest: ^2.20
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- spatie/laravel-ray: ^1.26
README
TransactionX 是一个强大的 Laravel 扩展包,旨在简化应用程序中的数据库事务。该包提供了一种无缝处理特定路由数据库事务的方式,确保数据完整性和一致性。
功能
-
自动事务: TransactionX 自动管理应用了该包的路由的数据库事务。在执行路由之前启动事务,并根据路由的结果提交或回滚事务。
-
条件执行: 该包仅对非 GET 请求执行事务,最小化对只读操作的影响,并优化数据修改请求的数据库交互。
-
错误处理: TransactionX 在路由执行过程中智能处理异常和错误。如果发生异常或 Laravel 错误处理系统报告错误,中间件将回滚事务以保持一致的状态。
入门指南
安装
使用 Composer 安装 TransactionX 包。
composer require rajentrivedi/transaction-x
设置
将 TransactionMiddleware 应用到您想要启用自动事务的路由组。
Route::group(['middleware' => 'transaction-x'], function () { // Your routes here });
或者,您可以将 TransactionMiddleware 应用到特定的路由。
Route::post('/example', function () { DB::table('your_table')->insert(['column' => 'value']); DB::table('some_other_table')->insert(['column' => 'value']); return response()->json(['success' => true]); })->middleware('transaction-x');
在应用 TransactionX 之前
use Illuminate\Support\Facades\DB; use App\Models\User; use App\Models\UserProfile; class UserController extends Controller { public function updateProfile(Request $request, $userId) { try { DB::beginTransaction(); // Update user profile logic $user = User::find($userId); $user->update($request->all()); // Additional operations with other tables $profile = UserProfile::where('user_id', $userId)->first(); $profile->update($request->get('profile_data')); // Another operation... DB::commit(); return response()->json(['success' => true]); } catch (\Exception $e) { DB::rollBack(); return response()->json(['error' => $e->getMessage()], 500); } } }
在此示例中,涉及两个不同的表(用户和用户档案)的操作。在这种情况下手动处理事务会导致复杂性增加和错误概率升高。
在应用 TransactionX 之后
use App\Models\User; use App\Models\UserProfile; class UserController extends Controller { public function updateProfile(Request $request, $userId) { // Update user profile logic $user = User::find($userId); $user->update($request->all()); // Additional operations with other tables $profile = UserProfile::where('user_id', $userId)->first(); $profile->update($request->get('profile_data')); // Another operation... return response()->json(['success' => true]); } }
使用 TransactionX,中间件负责处理事务,即使在同一路由中存在多个数据库交互。这使得代码更清晰、更易读,因为开发者可以专注于路由的逻辑,而无需显式管理事务。中间件确保在不同表之间一致地处理事务,促进代码的整洁性和可维护性。
享受一致的事务处理
使用 TransactionX,专注于构建应用程序逻辑,而包确保您的数据库事务得到一致的处理。
贡献
如果您遇到问题或对改进有建议,请随时在 GitHub 仓库中打开问题或提交拉取请求。
许可证
TransactionX 是在 MIT 许可下许可的开源软件。