最好为控制器中的每个新方法创建单独的请求类,还是在laravel中编辑现有的请求类或任何更好的主意?

时间:2018-08-04 06:25:12

标签: php laravel laravel-5 laravel-5.5 laravel-validation

为控制器中的每个新方法创建单独的请求类还是在laravel中编辑现有的请求类或更好的主意更好?

示例

 class fooBarController {

      public function a(fooBarARequest $r) {

      }

      public function b(fooBarBrequest $r) {

      }

      public function c(fooBarCDRequest $r) {

      }

      public function d(fooBarCDRequest $r) {

      } 
 }

1 个答案:

答案 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)请求,我们不使用自定义请求类,因为我们不需要验证任何内容(嗯,我们可以验证过滤器参数,但为简单起见,我们不这样做。

上面的示例还显示了检索当前用户的不同方法。即使如此,您也根本不需要任何请求。

这不是实际的生产代码,仅仅是我脑海中的东西……