Laravel多租户系统:实现添加租户的请求审批功能咨询
实现Laravel多租户租约请求审批流程
我来一步步帮你把直接创建租约改成租户审批的流程,基于你已经有accepted方法的情况,咱们从数据库到视图全流程梳理:
1. 调整数据库表结构
首先得给租约表加个状态字段,用来标记请求的状态(待审批/已接受/已拒绝)。用Laravel迁移来实现:
// 创建迁移文件 php artisan make:migration add_status_to_leases_table
打开生成的迁移文件,写入字段定义:
public function up() { Schema::table('leases', function (Blueprint $table) { $table->enum('status', ['pending', 'accepted', 'rejected'])->default('pending'); }); } public function down() { Schema::table('leases', function (Blueprint $table) { $table->dropColumn('status'); }); }
执行迁移生效:
php artisan migrate
2. 更新Lease模型
给模型添加状态常量(方便后续调用),同时设置默认属性和关联关系:
class Lease extends Model { use HasFactory; // 定义状态常量 const STATUS_PENDING = 'pending'; const STATUS_ACCEPTED = 'accepted'; const STATUS_REJECTED = 'rejected'; // 允许批量赋值的字段(加上新增的status) protected $fillable = [ 'tenant_id', 'landlord_id', 'start_date', 'end_date', // 其他原有字段... 'status' ]; // 设置默认状态为待审批 protected $attributes = [ 'status' => self::STATUS_PENDING, ]; // 关联房东和租户 public function landlord() { return $this->belongsTo(User::class, 'landlord_id'); } public function tenant() { return $this->belongsTo(User::class, 'tenant_id'); } }
3. 修改房东的租约创建逻辑
原来的store方法直接创建生效租约,现在改成创建待审批的请求:
class LandlordLeaseController extends Controller { public function store(Request $request) { // 验证表单数据(根据你的业务需求调整规则) $validated = $request->validate([ 'tenant_id' => 'required|exists:users,id', 'start_date' => 'required|date', 'end_date' => 'required|date|after:start_date', // 其他字段验证... ]); // 创建待审批的租约请求 Lease::create([ ...$validated, 'landlord_id' => auth()->id(), // 当前登录的房东ID ]); // 可选:给租户发送通知(后面会讲通知实现) $tenant = User::find($validated['tenant_id']); $tenant->notify(new LeaseRequestReceivedNotification(auth()->user())); return redirect()->back()->with('success', '租约请求已发送,请等待租户审批'); } }
4. 实现租户的请求处理功能
你已经有accepted方法,咱们完善它并新增拒绝逻辑,同时做好权限校验:
4.1 添加租户专属路由
在routes/web.php中添加租户处理请求的路由(注意用中间件限制只有租户能访问):
Route::middleware(['auth', 'tenant'])->group(function () { Route::post('/lease-requests/{lease}/accept', [TenantLeaseController::class, 'accept'])->name('lease-requests.accept'); Route::post('/lease-requests/{lease}/reject', [TenantLeaseController::class, 'reject'])->name('lease-requests.reject'); });
4.2 实现控制器处理方法
创建租户专用控制器:
php artisan make:controller TenantLeaseController
写入接受和拒绝的逻辑:
class TenantLeaseController extends Controller { public function accept(Lease $lease) { // 校验当前租户是请求的接收者 if ($lease->tenant_id !== auth()->id()) { abort(403, '你无权处理该请求'); } // 校验请求处于待审批状态 if ($lease->status !== Lease::STATUS_PENDING) { return redirect()->back()->with('error', '该请求已处理'); } $lease->update(['status' => Lease::STATUS_ACCEPTED]); // 可选:通知房东请求已接受 $lease->landlord->notify(new LeaseRequestAcceptedNotification($lease)); return redirect()->back()->with('success', '已接受租约请求'); } public function reject(Lease $lease) { // 同样的权限和状态校验 if ($lease->tenant_id !== auth()->id()) { abort(403, '你无权处理该请求'); } if ($lease->status !== Lease::STATUS_PENDING) { return redirect()->back()->with('error', '该请求已处理'); } $lease->update(['status' => Lease::STATUS_REJECTED]); // 可选:通知房东请求已拒绝 $lease->landlord->notify(new LeaseRequestRejectedNotification($lease)); return redirect()->back()->with('success', '已拒绝租约请求'); } }
4.3 租户视图展示待处理请求
在租户的仪表盘页面,展示所有待审批的租约请求,并添加操作按钮:
<div class="lease-requests"> <h3>待处理租约请求</h3> @forelse(auth()->user()->leases()->where('status', \App\Models\Lease::STATUS_PENDING)->get() as $request) <div class="request-card"> <p>发起方: {{ $request->landlord->name }}</p> <p>租期: {{ $request->start_date->format('Y-m-d') }} 至 {{ $request->end_date->format('Y-m-d') }}</p> <!-- 展示其他租约信息 --> <form action="{{ route('lease-requests.accept', $request) }}" method="POST" class="inline"> @csrf <button type="submit" class="btn btn-success">接受</button> </form> <form action="{{ route('lease-requests.reject', $request) }}" method="POST" class="inline"> @csrf <button type="submit" class="btn btn-danger">拒绝</button> </form> </div> @empty <p>暂无待处理的租约请求</p> @endforelse </div>
5. 可选:完善状态校验和通知功能
- 状态校验:后续业务逻辑中,只对
status为accepted的租约进行生效处理,比如房东查看有效租约:$activeLeases = auth()->user()->landlordLeases()->where('status', Lease::STATUS_ACCEPTED)->get(); - 通知功能:创建通知类实现邮件/站内信通知,比如:
然后在通知类中实现// 创建通知文件 php artisan make:notification LeaseRequestReceivedNotificationtoMail和toArray方法,给用户推送通知。
内容的提问来源于stack exchange,提问作者user9409047
相关产品推荐
相关产品推荐

