Как передать дополнительные данные после проверки?

#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.