laravel中控制器、form request与依赖注入协同实现请求处理:form request封装验证逻辑并自动执行;控制器通过类型提示注入form request获取已验证数据;构造函数注入服务类解耦业务逻辑;方法参数注入接口支持多态替换;form request自身可依赖注入服务以构建动态规则。

在Laravel应用中,控制器负责处理HTTP请求并返回响应,Form Request用于封装和执行请求验证逻辑,依赖注入则确保控制器能以松耦合方式获取所需服务。以下是三者协同使用的具体实践:
一、定义并使用Form Request进行请求验证
Form Request是Laravel提供的专用验证类,将验证规则与业务逻辑分离,提升可读性与复用性。它自动绑定到控制器方法,并在进入方法前执行验证,失败时自动重定向或返回JSON错误。
1、运行Artisan命令生成Form Request类:php artisan make:request StorePostRequest。
2、在生成的app/Http/Requests/StorePostRequest.php中,于rules()方法内定义验证规则,例如:return ['title' => 'required|string|max:255', 'content' => 'required|string'];。
3、在authorize()方法中返回true(或添加权限检查逻辑)以允许请求通过验证管道。
二、在控制器中注入Form Request并接收已验证数据
控制器方法参数类型提示为Form Request类时,Laravel会自动实例化该请求、执行验证,并将通过验证的数据以对象形式注入。无需手动调用$request->validate()。
1、在控制器方法签名中声明Form Request类型提示,例如:public function store(StorePostRequest $request)。
2、直接调用$request->validated()获取过滤后的数据数组,或使用$request->title等动态属性访问字段值。
3、验证失败时,Laravel自动根据请求类型返回重定向响应(Web)或JSON 422响应(API),无需额外处理分支逻辑。
三、通过构造函数注入服务类实现解耦
控制器应避免直接使用new实例化服务类,而应通过构造函数声明依赖,由Laravel服务容器自动解析并注入,便于测试与替换实现。
1、创建一个服务类,例如app/Services/PostService.php,并在其构造函数中声明所需依赖(如PostRepository)。
2、在控制器构造函数中类型提示该服务类:public function __construct(private PostService $postService)。
3、在控制器方法中直接使用$this->postService调用业务方法,例如$this->postService->create($request->validated())。
四、在控制器方法参数中注入接口契约实现多态替换
依赖注入支持接口类型提示,使控制器不绑定具体实现,便于在不同环境或测试中切换实现,增强可维护性。
1、定义接口app/Contracts/NotificationSender.php,声明send(string $message): void方法。
2、编写两个实现类,如MailNotificationSender和SmsNotificationSender,均实现该接口。
3、在控制器方法中类型提示接口:public function notify(NotificationSender $sender, Request $request),Laravel依据服务容器绑定决定注入哪个实现。
五、结合依赖注入与Form Request自定义验证器行为
Form Request本身支持依赖注入,可在其内部使用服务(如数据库查询、外部API调用)构建动态验证规则,例如唯一性检查需访问数据库。
1、在Form Request类的构造函数中声明依赖,例如:public function __construct(private UserRepository $userRepository)。
2、在rules()方法中调用依赖对象,构造动态规则:'email' => ['required', 'email', Rule::unique('users')->ignore($this->user)]。
3、确保该Form Request类被正确解析——Laravel默认支持在Form Request中注入服务,无需额外绑定配置。











