控制器

BaseController 是 XinAdmin 框架中所有业务控制器的基类,它继承自 Laravel 的 Controller 并提供了仓储类定义、权限验证白名单、默认控制器方法等核心功能。

仓储类定义

每个控制器都需要定义其对应的仓储类,通过实现 repository() 方法来指定具体的 Repository 实例。这是一个抽象方法,必须由子类实现:

abstract protected function repository(): RepositoryInterface;

例如:

protected function repository(): RepositoryInterface
{
    return app(SysUserRepository::class);
}
TIP

如果你不使用 repository 可以通过继承 Laravel 的 Controller 来避免定义 repository

权限验证白名单

通过 $noPermission 数组可以配置无需权限验证的方法,这些方法对所有用户开放:

protected array $noPermission = ['profile', 'updateProfile'];

默认控制器方法

BaseController 提供了标准的 CRUD 操作方法:

  • find(int $id) - 查询单个记录
  • query(Request $request) - 查询列表(支持分页)
  • create(Request $request) - 创建记录
  • update(Request $request, int $id) - 更新记录
  • delete(int $id) - 删除记录

这些方法依赖于 Repository 模式来执行实际的数据操作。

扩展或重写控制器方法

扩展控制器方法

如果需要在默认方法基础上添加额外逻辑,可以在子类中重写对应方法并调用父类方法:

public function create(Request $request): JsonResponse
{
    // 添加前置逻辑
    $userId = auth()->id();
    $requestData = $request->all();
    $requestData['creator_id'] = $userId;
    
    // 调用父类方法执行实际创建操作
    $result = parent::create(new \Illuminate\Http\Request($requestData));
    
    // 添加后置逻辑
    // 记录操作日志等
    
    return $result;
}

重写控制器方法

如果需要完全自定义某个方法的行为,可以直接重写而不调用父类方法:

public function update(Request $request, int $id): JsonResponse
{
    // 自定义更新逻辑
    $data = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email',
    ]);
    
    $user = $this->repository()->find($id);
    if (!$user) {
        return $this->error('用户不存在');
    }
    
    // 特殊业务逻辑,如密码加密等
    if (isset($data['password'])) {
        $data['password'] = bcrypt($data['password']);
    }
    
    $this->repository()->update($id, $data);
    
    return $this->success([], '更新成功');
}

自定义业务方法

除了标准的 CRUD 方法外,还可以添加自定义业务方法:

#[GetMapping('/profile', 'profile')]
public function profile(): JsonResponse
{
    $user = auth()->user();
    return $this->success($user);
}

#[PutMapping('/change-password', 'changePassword')]
public function changePassword(Request $request): JsonResponse
{
    $validated = $request->validate([
        'old_password' => 'required',
        'new_password' => 'required|min:6|confirmed',
    ]);
    
    $user = auth()->user();
    if (!Hash::check($validated['old_password'], $user->password)) {
        return $this->error('原密码错误');
    }
    
    $user->password = bcrypt($validated['new_password']);
    $user->save();
    
    return $this->success([], '密码修改成功');
}