我从两个地方调用控制器方法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}之前正在验证来自表单请求的数据} 方法。那我该如何实现呢?
答案 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()
实例手动进行时,后一种方法才允许解决依赖。 >
如果您需要有关类提取/绑定的进一步说明,请告诉我,我将详细说明我的答案。