Laravel: как мне отправить форму и остаться в том же представлении?

#php #laravel #forms #controller

#php #laravel #формы #контроллер

Вопрос:

У меня в Laravel есть представление, в котором уже включены циклы foreach. Внизу страницы находится небольшая форма. Теперь я хочу отправить эту форму, чтобы сохранить данные в базе данных.

В то же время я хочу оставаться в том же виде. Если я ввожу ту же страницу в форму, я получаю сообщение об ошибке. Если я хочу вернуться к представлению через контроллер, я также получаю сообщение об ошибке.

В этой ошибке вывод данных в цикле, который ранее был передан другим контроллером, больше не работает. — Что я могу сделать?

Неопределенная переменная: данные (View: /srv/users/smartfinance/apps/smartfinance/public/laravel/resources/views/home.blade.php )

   <?php $__currentLoopData = $data; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $d): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
  

Я надеюсь, вы понимаете мою проблему и можете дать мне подсказку, как ее решить.

Это два контроллера:

 class checkDataController extends Controller
{
    public function data()
    {
        $data = DB::table('test')->where('booking_date', '=', $today)->get();
        return view('home', compact("data"));
    }
}

class AddContractController extends Controller
{
    public function addNewData(Request $request)
    {
        $bez = $request->bez;
        return view('home');
    }
}
  

Комментарии:

1. Можете ли вы показать нам код вашего контроллера, который вы используете в данный момент? Лучше всего подходит для обоих методов, того, который отображает ваше представление, и того, который обрабатывает отправку вашей формы.

2. Я интегрировал контроллеры в текст.

Ответ №1:

Обычно это делается путем перенаправления обратно на ту же страницу, с которой вы отправили. Вот как это будет выглядеть в вашем контроллере:

 public function addNewData(Request $request)
{
    $bez = $request->bez;
    return back();
}
  

Для улучшения пользовательского интерфейса вам также следует добавить сообщение в представление с формой:

 @if(session('status'))
    <div class="alert alert-success" role="alert">
        {{ session('status') }}
    </div>
@endif
  

И внесите одно небольшое изменение в свой контроллер:

 return back()->with('status', "Successfully submitted {$bez}!");
  

Ответ №2:

Ваша ошибка в том, что вы пытаетесь отобразить одно и то же представление с помощью двух разных методов контроллера. Обычно представление используется только одним методом контроллера. Другие методы могут перенаправлять на этот метод, чтобы (повторно) отобразить то же представление. Таким образом, логика извлечения данных для представления требуется только в одном месте.

 class CheckDataController extends Controller
{
    // route 'check.data'
    public function data()
    {
        $data = DB::table('test')->where('booking_date', '=', $today)->get();
        return view('home', compact("data"));
    }
}

class AddContractController extends Controller
{
    // route 'contract.create'
    public function addNewData(Request $request)
    {
        Contract::create($request->input()); // unsafe, only for demonstration...

        return redirect()->route('check.data');
    }
}
  

Как вы можете видеть, вместо return view('home') мы возвращаемся redirect()->route('check.data') . Это перенаправит пользователя на другой контроллер с определенным маршрутом. Конечно, это означает, что вы фактически выполняете два метода контроллера в одном пользовательском действии, но это обычная практика.

Более подробную информацию о перенаправлениях можно найти в официальной документации.

Ответ №3:

Советую тебе, мой друг, не возвращать представление из метода post.

Я полагаю, что метод addNewData () — это метод, который исходит из маршрута post. итак, когда вы возвращаете представление после метода post, вы не предоставляете данные для своей страницы. итак, laravel выдает ошибку и жалуется на отсутствующую переменную. итак, что вы должны сделать, это перенаправить на маршрут, который просматривает страницу. Итак, ваш метод будет выглядеть примерно так:

 public function addNewData(Request $request)
    {
        $bez = $request->bez;
        return redirect('YOUR ROUTE TO VIEW THE PAGE (URL)');
    }