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、在生成的
中,于
方法内定义验证规则,例如:
return ['title' => 'required|string|max:255', 'content' => 'required|string'];
。
3、在
方法中返回
(或添加权限检查逻辑)以允许请求通过验证管道。
二、在控制器中注入Form Request并接收已验证数据
控制器方法参数类型提示为Form Request类时,Laravel会自动实例化该请求、执行验证,并将通过验证的数据以对象形式注入。无需手动调用
。
1、在控制器方法签名中声明Form Request类型提示,例如:
public function store(StorePostRequest $request)
。
2、直接调用
获取过滤后的数据数组,或使用
等动态属性访问字段值。
3、验证失败时,Laravel自动根据请求类型返回重定向响应(Web)或JSON 422响应(API),无需额外处理分支逻辑。
三、通过构造函数注入服务类实现解耦
控制器应避免直接使用
实例化服务类,而应通过构造函数声明依赖,由Laravel服务容器自动解析并注入,便于测试与替换实现。
1、创建一个服务类,例如
,并在其构造函数中声明所需依赖(如
)。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
2、在控制器构造函数中类型提示该服务类:
public function __construct(private PostService $postService)
。
3、在控制器方法中直接使用
调用业务方法,例如
。
四、在控制器方法参数中注入接口契约实现多态替换
依赖注入支持接口类型提示,使控制器不绑定具体实现,便于在不同环境或测试中切换实现,增强可维护性。
1、定义接口
,声明
方法。
2、编写两个实现类,如
和
,均实现该接口。
3、在控制器方法中类型提示接口:
public function notify(NotificationSender $sender, Request $request)
,Laravel依据服务容器绑定决定注入哪个实现。
五、结合依赖注入与Form Request自定义验证器行为
Form Request本身支持依赖注入,可在其内部使用服务(如数据库查询、外部API调用)构建动态验证规则,例如唯一性检查需访问数据库。
1、在Form Request类的构造函数中声明依赖,例如:
public function __construct(private UserRepository $userRepository)
。
2、在
方法中调用依赖对象,构造动态规则:
'email' => ['required', 'email', Rule::unique('users')->ignore($this->user)]
。
3、确保该Form Request类被正确解析——Laravel默认支持在Form Request中注入服务,无需额外绑定配置。
app/Http/Requests/StorePostRequest.phprules()authorize()true$request->validate()$request->validated()$request->titlenewapp/Services/PostService.phpPostRepository$this->postService$this->postService->create($request->validated())app/Contracts/NotificationSender.phpsend(string $message): voidMailNotificationSenderSmsNotificationSenderrules()