【问题标题】:Using variable name in Laravel request object在 Laravel 请求对象中使用变量名
【发布时间】:2019-03-23 00:29:10
【问题描述】:

我需要能够遍历 laravel 请求变量的列表并对它们做一些事情。我希望能够在调用请求对象时使用一个变量,这样我就可以循环运行它,而不是为每个对象编写一行代码。

例如,我的文本输入可能具有类似这样的名称

contact_main_name
contact_main_telephone
contact_main_email

contact_sub_name
contact_sub_telephone
contact_sub_email

contact_backup_name
contact_backup_telephone
contact_backup_email

在我的请求中,我不想写

$request->contact_main_name
$request->contact_main_telephone

对于我可能拥有的每种不同类型的联系人,我希望能够像这样遍历它们

$contactTypes = [
    'main',
    'sub',
    'backup',
    'head'
];

    foreach($contactTypes as $type){
        //Start a new contact
        $contact = new Contact;
        $contact->type = $type;
        $contact->name = $request->${"contact_".$type."_name"};
        $contact->telephone = $request->${"contact_".$type."_telephone"};
        $contact->email = $request->${"contact_".$type."_email"};
        $contact->save();
    }

在调用 laravel $request 时如何使用变量名,以便我可以构建一个可能类型的数组并循环遍历它们?

注意 我知道我可以编辑输入字段本身,使其看起来像name="contact[type][name]",然后循环遍历它们,但我不能更改输入名称,我必须通过控制器本身的 php 来完成。

【问题讨论】:

  • 如果您只需要将数据持久化到模型中,您可能需要检查质量分配。
  • 尝试使用$request->input("contact_".$type."_name");(除非$request->${"contact_".$type."_name"}; 有效,而我错过了实际问题)
  • @TimLewis 没想到这一点我觉得很愚蠢。很好的快速回答,谢谢!

标签: php laravel laravel-5


【解决方案1】:

正如 cmets 中的回答,要做到这一点,请更改调用输入的方法并使用实际的 input() 函数本身。

$contactTypes = [
    'main',
    'sub',
    'backup',
    'head'
];

foreach($contactTypes as $type){
    //Start a new contact
    $contact = new Contact;
    $contact->type = $type;
    $contact->name = $request->input("contact_".$type."_name");
    $contact->telephone = $request->input("contact_".$type."_telephone");
    $contact->email = $request->input("contact_".$type."_email");
    $contact->save();
}

【讨论】:

  • 我认为$request->{"contact_".$type."_name"}; 也应该可以工作,但是你还有一个额外的$ ($request->${ ... ) 所以它正在寻找一个名为$contact_whatever_name 的变量
  • 您确实意识到,如果您删除 $... $request->{"contact_".$type."_name"};跨度>
【解决方案2】:

顺便说一句,您还可以稍微修改它以使用与字段名称匹配的数组索引;这将允许您稍后通过将适当的字段添加到数据库和 HTML 而无需接触代码来添加字段,并使用 array_keys() 检索提交的类型以允许无缝添加类型。只要您的验证是严格的,这可能是允许未来扩展的最自动化的方式......

例如。字段名称:

contact[main][name]
contact[main][telephone]
...
contact[backup][email]

例如。代码:

foreach(array_keys($request->input('contact')) as $type) {
    $contact = Contact::create($request->input('contact.'.$type));
    $contact->type = $type;
    $contact->save();
}

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 2011-08-19
    • 2015-12-27
    • 2013-06-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    相关资源
    最近更新 更多