为控制器中的每个新方法创建单独的请求类还是在laravel中编辑现有的请求类或更好的主意更好?
示例
class fooBarController {
public function a(fooBarARequest $r) {
}
public function b(fooBarBrequest $r) {
}
public function c(fooBarCDRequest $r) {
}
public function d(fooBarCDRequest $r) {
}
}
答案 0 :(得分:1)
使用额外的请求类,您可以定义验证规则,在请求到达控制器之前,将对这些规则进行检查。您也可以在请求类中处理授权。一个例子是:
class UpdateAccountEmail extends FormRequest
{
public function authorize()
{
return true; // authorization is handled on route/middleware level
}
public function rules()
{
return [
'new_email' => 'required|email|confirmed',
'new_email_confirmation' => 'required',
];
}
}
因此,总结起来:对于没有有效载荷需要验证的请求,使用自定义请求类是没有意义的。这意味着,对于普通的GET
请求,我们最有可能(当然也有例外)想要使用laravel提供的普通Request
类。这样的控制器会很正常:
class AccountController
{
public function show(Request $request)
{
return view('account.show', ['user' => $request->user()]);
}
public function edit()
{
return view('account.edit', ['user' => \Auth::user()]);
}
public function updateEmail(UpdateAccountEmail $request)
{
$user = $request->user();
$user->email = $request->input('new_email');
$user->save();
return redirect()->route('account.index');
}
public function logins(Request $request)
{
$logins = $request->user()->logins()
->when($request->get('filter_from'), function ($query, $from) {
$query->where('created_at', '>=', $from);
})
->when($request->get('filter_until'), function ($query, $until) {
$query->where('created_at', '<=', $until);
})
->get();
return view('account.logins', ['logins' => $logins]);
}
}
如您所见,对于GET
处理的logins(Request $request)
请求,我们不使用自定义请求类,因为我们不需要验证任何内容(嗯,我们可以验证过滤器参数,但为简单起见,我们不这样做。
上面的示例还显示了检索当前用户的不同方法。即使如此,您也根本不需要任何请求。
这不是实际的生产代码,仅仅是我脑海中的东西……