如何在内部调用接收自定义表单请求验证参数的控制器

时间:2019-04-04 16:57:03

标签: laravel validation

我从两个地方调用控制器方法store。首先,直接从表单提交开始,这意味着一旦我提交了store方法,就会被调用。

第二种方法是从laravel的其他方法调用store方法。这是store方法代码。

public function store(MedicalAidRequest $request)
{
    //
    if(Auth::check()){
        $medicalAidRequest = session('medical_aid_request', $request->all());
        $medicalAidRequest['user_id'] = Auth::id();
        return $this->aidRepository->add($medicalAidRequest);
    }else{
        session(['medical_aid_request' => $request->all()]);
        return redirect('login')->with('from', 'aid_request');
    }
}

我使用此代码是因为我想满足以下要求。

  • 如果用户已登录,请提交医疗救助。
  • 如果用户未登录,则将请求数据存储在会话中并要求进行记录,一旦用户登录,则再次调用store方法以从会话中检索表单数据并将其保存到数据库。

但是,当我在登录后内部调用store方法时,由于MedicalAidRequest参数中的store导致验证失败,该参数在调用{{1}之前正在验证来自表单请求的数据} 方法。那我该如何实现呢?

2 个答案:

答案 0 :(得分:0)

首先:

您可以在内部使用有效数据创建请求,然后在调用时传递给store方法。

您可以创建如下请求:

$request = new <Namespace>\MedicalAidRequest();

然后,您可以使用replace方法手动添加输入,如下所示:

$request->replace(['key' => 'value']);
$controller = new YourController();
$controller->store($request);

第二

您可以在控制器内部而不是在表单请求中验证请求。如果这样做,则可以在存储方法中传递一个标志,例如$isInternal,如果internal是true,则不要运行验证。方法如下:

public function store($isInternal = false)
{
  if(!$isInternal){
    $this->validate(request(), $this->rules());
  }
  //Rest of the code remain same
}

private function rules():array
{
  //return your rules array here as in the MedicalAidRequest
}

答案 1 :(得分:0)

我在将内部呼叫转发到另一个控制器时遇到了同样的问题。

要解决此问题,您必须使用所有必需的参数创建一个新的请求对象,然后让 app内核对其进行处理。 这样,Laravel可以像处理浏览器中那样处理精心制作的请求。

要执行上述操作,请创建 request 并在应用实例上调用handle方法:

$request = Request::create($url, $action, $params, $cookies, $files, $headers);

$response = app()->handle($request);

// If needed you can use the response of the internal call
// if ($response->getStatusCode() == 404) {
//     abort(404);
// }

如果您需要在多个地方使用该功能,则可以决定提取到其自身的特征(最快的方法);或将逻辑移到自己的中,您可以在应用容器中绑定

仅当需要通过方法签名中的Laravel的 typehinting注入或通过app()实例手动进行时,后一种方法才允许解决依赖。 >

如果您需要有关类提取/绑定的进一步说明,请告诉我,我将详细说明我的答案。