【问题标题】:How do you work with sub forms in Laravel 4你如何在 Laravel 4 中使用子表单
【发布时间】:2013-09-09 17:51:32
【问题描述】:

我试图找到 laravel 4 在请求中处理数组数据的方式,但在网上找不到任何示例、教程和文档。

例子:

<select name="productDetails[0][service]">...</select>
<select name="productDetails[0][product]">...</select>
<select name="productDetails[0][action]">...</select>
<select name="productDetails[1][service]">...</select>
<select name="productDetails[1][product]">...</select>
<select name="productDetails[1][action]">...</select>

最终成为:

$_GET['productDetails'][0]['service']
$_GET['productDetails'][0]['product']
$_GET['productDetails'][0]['action']
$_GET['productDetails'][1]['service']
$_GET['productDetails'][1]['product']
$_GET['productDetails'][1]['action']

现在,如果我想让我的表单正常工作,我已经读取了这些数据,但我不能假设 productDetails 是一个数组并且特征为 0。我想使用 Laravel/Symfony 的 HTTP Foundation 组件提供的设施。

我试过没有用:

Request::get('productDetails.0.service', null); //Doesn't work
Request::get('productDetails[0][service]', null); //Doesn't work
Request::get('productDetails.1.service', null); //Doesn't work
Request::get('productDetails[1][service]', null); //Doesn't work

我认为这些版本会起作用,因为您可以访问会话、配置以及可能许多其他类似的数据源。只是难倒这不起作用...另一方面,以下 sn-p 有效,但这很丑陋,因为您不能始终假设 productDetails 是一个数组,也不能假设 0 索引存在也不“服务”索引也是...

Request::get('productDetails', array())[0]['service']; //Works but ugly
Request::get('productDetails', array())[1]['service']; //Works but ugly

那么正确的方法是什么?


编辑#1

在标签中添加了 symfony,我现在意识到来自 Laravel 的 Request 对象确实是来自 symfony 的 HTTPFoundation,那么这些人是如何处理这一切的呢?我是唯一一个?我确定这只是命名约定的问题,我可能没有使用正确的术语来搜索我的文档

【问题讨论】:

    标签: php validation symfony laravel


    【解决方案1】:

    啊啊啊终于找到了:

    Request::query('productDetails[0]', array()); //array('service' => 2, 'product' => null, 'action' => null);
    Request::query('productDetails[1]', array()); //array('service' => 3, 'product' => null, 'action' => null);
    Request::query('productDetails[0][service]', array()); //2
    Request::query('productDetails[1][service]', array()); //3
    

    不得不对 Request 类和 Symfony HTTPFoundation 进行一些研究,但能够在其中找到解释其工作原理的示例和代码。

    希望这对其他人有所帮助...

    【讨论】:

    • 最后,还必须在 Illuminate\Http\Request 中创建“Request”方法以允许访问 HTTPFoundation Request 变量,因为 GET 机制与 QUERY 的应用方式不同。在 Laravel 上创建一个拉取请求以将其应用于所有人,因为这是一个很好的补充
    【解决方案2】:

    有什么理由不将它们切换为单独的输入?

    <select name="productDetailService">...</select>
    <select name="productDetailsProduct">...</select>
    <select name="productDetailsAction">...</select>
    

    我相信您已经意识到,这意味着在您的表单处理代码中分别处理每一项。

    但是,如果您不想创建一个需要临时添加新 productDetails 字段的表单,我认为没有理由通过以这种方式使用数组来使代码更加混乱 - 处理每个单独或将它们视为单独的字段(与数组中的聚合相比)可能是更好的方法。

    【讨论】:

    • 显然这是因为我计划拥有多个 productDetail... 我可以使用“productDetails_0_service”、“productDetails_1_service”命名约定,但这违反了 IMO 的良好编程实践。到目前为止,我更喜欢拥有数组并仅验证每个数组的结构,但我只是不想被困在已经存在的情况下必须全部完成...
    • 刚刚看到Request其实是一个HTTPFoundation Request,想看看他们在symfony中是如何处理子表单的,这可能是我问题的关键
    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2015-01-20
    • 2013-07-05
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多