#laravel #laravel-5.7
#laravel #laravel-5.7
Вопрос:
После проверки я хочу передать некоторые дополнительные данные для просмотра. Однако я не могу его отправить.
Мой контроллер похож,
public function test()
{
$validator = Validator::make(
request()->all(),
[ 'ziptest' => 'regex:/^([0-9]{3}-[0-9]{4})$/']
);
$errors = $validator->errors();
if($errors->any()) {
return back()
->withErrors($errors)
->withTitle('Data From Controller')
->withInput();
}
return 'success';
}
В моем блейде я хочу проверить, передан ли заголовок или нет. Итак, в моем представлении блейда у меня есть
@if($errors->any())
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
@endif
@if(isset($title))
<p>{{ $title }}</p>
@endif
Однако часть с ошибкой отображается правильно. Но не заголовок. Почему это не работает?
Я также пытался отправить заголовок таким образом.
return back()->withErrors($errors)
->with('title','Data From Controller')
->withInput();
Это также не работает.
Я искал в SO и нашел несколько похожих вопросов, касающихся передачи данных из контроллера в представление. Однако моя ситуация немного иная.
Ответ №1:
В вашем примере вы перенаправляетесь обратно в предыдущее местоположение. Когда вы используете with*
для перенаправления, информация передается в сеанс, а не становится доступной непосредственно для представления, как это было бы, если бы вместо этого вы возвращали представление.
Чтобы это сработало с вашим примером, вам нужно будет проверить session('title')
, чтобы получить мигающий заголовок из перенаправления.
Комментарии:
1. Спасибо. Я это понимаю. Еще немного разъяснений. верните view()-> with() и return back()->with(); Оба с помощью () работают по-разному. Я прав?
2. Точно — view создает файл блейд-представления, проходящий через заданные данные, redirect генерирует HTTP-перенаправление и помещает заданные данные в сеанс. Laravel автоматически повторно заполняет представление ошибками из сеанса (см. Промежуточное ПО ShareErrorsFromSession в вашем приложении).
3. В качестве примечания,
withErrors
на самом деле создается$errors
переменная в перенаправленном маршруте, но это происходит из-за промежуточногоShareErrorsFromSession
программного обеспечения, так что это особый случай. Предположительно, вы могли бы создать собственное промежуточное программное обеспечение для эмуляции аналогичного поведения для других переменных
Ответ №2:
Ваш второй подход почти правильный.
return back()->withErrors($errors)
->with([
'title' => 'Data From Controller'
])
->withInput();
обратите внимание на обозначение массива
Комментарии:
1. Извините, проблема все еще существует. Нет «заголовка» на блейд-странице.
Ответ №3:
используйте здесь array_merge
метод
$errors = $validator->errors();
if($errors->any()) {
$newErrors = array_merge($errors->toArray(),['title' => 'Data From Controller']);
return back()
->withErrors($newErrors)
->withInput();
}
Комментарии:
1. Он возвращает данные, но как ошибку. Можно ли отправлять данные как обычную переменную?
Ответ №4:
Вы пробовали после проверки, но он вернет данные, как в пакете ошибок
$validator->after(function ($validator) {
$validator->errors()->add('someField', 'Somedata');
});
И мне интересно, откуда вы вызываете view, потому что я видел, что ваш test()
метод выполняет только часть проверки, с помощью вашего view вы можете передавать данные с ним, но с проверкой, я думаю, как в пакете ошибок, вы можете отправлять данные для просмотра.
Комментарии:
1. Почему я должен возвращать данные внутри пакета ошибок? Это не ошибка. Я не вызываю view отсюда. Только я выполняю проверку.
2. Посмотрите, у вас много грязных опций, таких как сеанс и файлы cookie, в противном случае передайте данные с помощью view, откуда бы вы ни вызывали свой view.