首页 > 解决方案 > Laravel - 从 8 个单独的表单中收集数据

问题描述

我需要收集来自 8 种不同表单的表单数据。我需要所有表单都是子数组,并且只有 1 个数组包含所有子数组。这种结构的原因是我将根据子数组以不同的方式操作内容。

每个表单都有自己的提交按钮,目前不需要一个请求提交所有表单。

以下是其中 2 个表格的代码。

问题:如果我填写了两个表单,为什么我在最后一次运行表单时在 print_r 结果中没有看到 [form_1] 和 [form_2]?

如何解决它的理论包括一个负责合并所有子数组表单数据的构造函数。

结果:

Array
(
    [form_1] => Array
        (
            [user] => 123
        )

)

Array
(
    [form_2] => Array
        (
            [user] => 456
        )

)

想要的结果:(应该是 8,只显示 2 用于演示):

Array
(
    [form_1] => Array
        (
            [user] => 123
        )
    [form_2] => Array
        (
            [user] => 456
        )

)

我的代码:


[路线/web.php]:

Route::get('/form-1', function () {
    return view('form_1');
});

Route::get('/form-2', function () {
    return view('form_2');
});

Route::post("/process_form_1", "FormHandler@result_1");
Route::post("/process_form_2", "FormHandler@result_2");

[Form_1.blade.php]:

表格-1

<form action="/process_form_1" method="post">

  @csrf
  <label for="1">Name</label>
  <input id="1" type="text" name="user"><br>
  <button submit="button" name="button">Send</button>

</form>

[Form_2.blade.php]:

表 2

<form action="/process_form_2" method="post">

  @csrf
  <label for="1">Name</label>
  <input id="1" type="text" name="user"><br>
  <button submit="button" name="button">Send</button>

</form>

[FormHandler.php]:

命名空间 App\Http\Controllers;

使用 Illuminate\Http\Request;

类 FormHandler 扩展控制器 {

function result_1(Request $request)
{

  $this->result['form_1'] = $request->input();

  echo "<pre>";
  print_r($this->result);
  echo "</pre>";

// return (redirect('form-1'));

}

function result_2(Request $request)
{

  $this->result['form_2'] = $request->input();

  echo "<pre>";
  print_r($this->result);
  echo "</pre>";

// return (redirect('form-2'));

}

}

标签: laravelformslaravel-7.x

解决方案


我想我明白了你想要做什么,当你向服务器发出请求时,它会创建一个新的 Laravel 实例来处理请求,从而处理任何对象(即你试图附加请求输入的控制器对象to) 将是新的,因此新请求将无法访问 $this->result,因为它是控制器的新实例。访问它的唯一方法是将其存储在数据库中,然后再次访问,或者为每个请求发送所有表单中的所有数据。根本不可能(您也不希望这样)从不同的请求访问数据。

您可以考虑使用 Redis 在请求之间将数据缓存在内存中,这可能是此类问题的最常见解决方案。


推荐阅读