Как вызвать контроллер внутри, который получает параметр проверки запроса пользовательской формы - PullRequest
0 голосов
/ 04 апреля 2019

Я вызываю метод контроллера store из двух мест.Во-первых, непосредственно из отправки формы, то есть когда я отправляю, вызывается метод from store.

Второй способ - это вызов метода store из другого метода laravel.Вот код метода 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, который проверяет данные из запроса формы довызов метода store.Так как же мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

У меня была такая же проблема, чтобы переадресовать внутренний вызов на другой контроллер .

Чтобы решить эту проблему, вы должны создать новый объект запроса со всеми необходимыми параметрами, а затем позволить ядру приложения обработать его. Таким образом, Laravel будет обрабатывать созданный запрос, как если бы вы делали это в браузере.

Чтобы сделать, как указано выше, создайте запрос и вызовите метод 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 из подписи метода или вручную через app() экземпляр.

Если вам понадобится дальнейшее объяснение о извлечении / связывании классов, дайте мне знать, и я уточню свой ответ.

0 голосов
/ 04 апреля 2019

Во-первых:

Внутренне вы можете создать запрос с действительными данными, а затем перейти к методу store при вызове.

Вы можете создать запрос, как показано ниже:

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

Затем вы можете использовать метод замены, чтобы добавить ввод вручную, как показано ниже:

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

Во-вторых

Вы можете проверить запрос внутри контроллера, а не в форме запроса. Если вы сделаете это, вы можете передать флаг в методе хранилища, например, $isInternal, если внутреннее значение равно 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...