首页 > 解决方案 > Laravel:我如何提交表单并保持在同一个视图中?

问题描述

我在 Laravel 中有一个视图,其中已经包含了 foreach 循环。页面底部是一个小表格。现在我想发送此表单以将数据保存到数据库中。

同时,我想保持相同的观点。如果我在表单中输入相同的页面,我会收到一条错误消息。如果我想通过控制器返回视图,我也会收到错误消息。

在此错误中,先前由另一个控制器传递的循环中数据的输出不再起作用。- 我能做些什么?

未定义变量:数据(查看:/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');
    }
}

标签: phplaravelformscontroller

解决方案


您的错误是您尝试从两种不同的控制器方法显示相同的视图。通常,视图仅由一种控制器方法使用。其他方法可以重定向到此方法以(重新)显示相同的视图。这样,为视图检索数据的逻辑只需要在一个地方进行。

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')。这会将用户重定向到具有定义路由的另一个控制器。当然,这意味着您实际上是在一个用户操作中执行两个控制器方法,但这是常见的做法。

有关重定向的更多信息可以在官方文档中找到。


推荐阅读