如何在 Laravel 中填充 HTML 表单中的字段?

Posted

技术标签:

【中文标题】如何在 Laravel 中填充 HTML 表单中的字段?【英文标题】:How to populate the fields from HTML form in Laravel? 【发布时间】:2019-01-29 04:15:42 【问题描述】:

我正在构建一个表单,我想在其中填充来自表单的字段(我将其命名为posting.blade.php

我使用的控制器是:

public function store(Request $request)

    $this->validate($request, [
    'name' => 'required',
    'email' => 'required|email',
    'number' => 'required',
    'city' => 'required',
    'post' => 'required'
    ]);

    Mail::send('emails.posting-message', [
    'msg'=> $request->message
    ], function($mail) use($request) 
        $mail->from($request->email, $request->name);
        $mail->to('helloworld@gmail.com')->subject('Contact Message');
    );
    return redirect()->back()->with('flash_message', 'Thank you for your message');

问题陈述:

当前控制器没有返回任何内容,因为'msg'=> $request->message 行中没有验证消息。但是如果我使用

'msg'=> $request->name(返回名称)

我想知道我应该在控制器中进行哪些更改,以便它返回验证中存在的每个字段。

我试过这个,但它只返回最后一个值,即 post。

       'msg'=> $request->name,
       'msg'=> $request->email,
       'msg'=> $request->number,
       'msg'=> $request->city,
       'msg'=> $request->post

【问题讨论】:

使用旧输入法是 IMO 最好的方法。因为它被 Laravel 本身加强了。 laravel.com/docs/5.6/requests IMO 是什么意思? 在我看来。 :) 说实话,我在 Laravel 上工作的时间不多。我想知道您是否可以给我一个指针,我需要在代码中进行哪些更改 伙计,听我说完,好吗? Laravel 是我使用过的最精细的框架之一。没有捷径可走。你需要研究它。我建议按照他们建议的教程进行操作,在这个laravel-news.com/your-first-laravel-application 中,在其中提到了old() 函数的用法。把时间花在它上面,伙计。这是完全值得的。 【参考方案1】:

首先,您需要在重定向中添加->withInput()

return redirect()->back()->with('flash_message', 'Thank you for your message')->withInput();

这会将所有提交的表单字段闪烁到会话中。

重定向后,如要获取名为title的表单字段的值,可以使用old() helper,如:

<input type="text" name="title" value=" old('title') ">

您还可以将第二个参数传递给助手:

<input type="text" name="title" value=" old('title', $post->title) ">

你明白了。

【讨论】:

OP 不是询问 flash 消息,而是询问作为联系表单中的字段名称的消息,并且没有在控制器中获取其值【参考方案2】:

听起来您正在尝试做的是从表单提交中获取所有输入,并将它们传递给一个名为 posting-message 的 Laravel 刀片模板,该模板用于构建电子邮件。

如果我的理解是正确的,那么您就快到了 - 这只需要您将更多变量传递给您的电子邮件刀片模板。目前,您只是通过一个名为 msg 的变量。

所以你的控制器的邮件部分变成这样:

Mail::send('emails.posting-message', [
    'name'=> $request->name,
    'email'=> $request->email,
    'number'=> $request->number,
    'city'=> $request->city,
    'post'=> $request->post
], function($mail) use($request) 
    $mail->from($request->email, $request->name);
    $mail->to('helloworld@gmail.com')->subject('Contact Message');
);

然后在您的电子邮件刀片模板中,您可以访问 $name $email 等变量。

附言 如果您想在控制器中一次性获取所有输入并将它们放入数组中,Laravel provides some ways 批量检索输入,例如:

$allInputs = $request->all();

pps 考虑为每个表单输入做更多的validation 而不仅仅是必需,以确保从用户提供的数据是您所期望的而不是恶意的或不正确。

【讨论】:

【参考方案3】:

首先您需要检查 html 中的字段名称,确保其确切的消息没有空格或拼写错误。

第二件事检查所有的帖子字段使用 $request-&gt;all(); 看看你有没有得到post数组中的“message”索引。

如果您没有在验证中添加该字段,那么您将不会在 POST 中得到它。

但是当您使用联系表单时,您应该保持“消息”字段为必填项,并应将其添加到验证中。这样,您将始终在消息字段中获得一些数据。

能否请您在问题中也发布 html,以便每个人都对此有更多了解。

关于将您已经获得的数据发送到邮件模板的其他问题,您可以使用以下方法

$msg = array('name' => $request->name,'email' => $request->email,'number' => $request->number,'city' => $request->city,'post' => $request->post,'message'=>$request->message);

你可以像使用数组一样

Mail::send('emails.posting-message', [$msg    
    ], function($mail) use($request) 
        $mail->from($request->email, $request->name);
        $mail->to('helloworld@gmail.com')->subject('Contact Message');
    );

然后您可以轻松访问邮件模板中的所有变量以使其动态化。

【讨论】:

【参考方案4】:

您提供的sn-p如下:

   'msg'=> $request->name,
   'msg'=> $request->email,
   'msg'=> $request->number,
   'msg'=> $request->city,
   'msg'=> $request->post

表示数组键msg被覆盖了4次。

您可能需要以下方法:

    $msg['name'] = $request->name;
    $msg['email'] = $request->email;
    $msg['number'] = $request->number;
    $msg['city'] = $request->city;
    $msg['post'] = $request->post;

【讨论】:

【参考方案5】:

首先,你不需要使用back方法和redirectback()函数无论如何都会重定向用户。

return back()-&gt;with('key','Val');

看看这个:Old Input

正如其他人所说,要将查询字符串/输入发送到 cookie,请根据文档使用 withInput() 函数,它将刷新所有当前输入:

return back()-&gt;with('key','Val')-&gt;withInput();

如果你看过 Laravel 的默认注册和登录刀片,你就会知道你可以使用 old() 帮助器根据 cookie 和会话获取以前的值。


   'msg'=> $request->name,
   'msg'=> $request->email,
   'msg'=> $request->number,
   'msg'=> $request->city,
   'msg'=> $request->post

给数组赋值有一些方法,但记住永远不要像这样覆盖它们!

您可以使用自动索引方法,如果您使用$msg[] = $request-&gt;bar,它将索引从0到分配长度的值

$data[] = $request->val1;
$data[] = $request->val2;
...

但您也可以像这样确定每个元素的键:

$data['name'] = $request->name;
$data['email'] = $request->email;
...

毕竟,如果您想将所有输入作为第二个参数发送,只需使用$request-&gt;all()

Mail::send('emails.posting-message', $request->all(), function($mail) use($request) 
        $mail->from($request->email, $request->name);
        $mail->to('helloworld@gmail.com')->subject('Contact Message');
);

【讨论】:

【参考方案6】:

我前段时间遇到过类似的问题,经过几次尝试,我将字段名从message更改为comments,这就是解决方案。

我怀疑message 可能是框架在会话中使用的变量名或类似的东西。

希望对你有帮助。

【讨论】:

【参考方案7】:

您需要在返回的响应中添加withInput() 方法

return redirect()->back()->with('flash_message', 'Thank you for your message')->withInput();

要在下一个请求期间保留来自一个请求的输入,您需要使用 old() 助手。在此处查看文档https://laravel.com/docs/5.6/requests#old-input

<input type="text" name="title" value=" old('username') ">

Laravel 会自动将用户重定向回他们之前的位置。此外,所有验证错误都会自动闪现到会话中。在此处查看文档https://laravel.com/docs/5.6/validation#quick-displaying-the-validation-errors。要显示验证错误消息,您可以像这样使用

@foreach ($errors->all() as $error)
    <li> $error </li>
@endforeach

或者更具体的

<input type="text" name="title" value=" old('username') ">
<span class="error">$error->title</span>

【讨论】:

【参考方案8】:

据我了解,您是在询问如何将输入发送到邮件模板。

试试这个;

public function store(Request $request)

    $this->validate($request, [
        'name' => 'required',
        'email' => 'required|email',
        'number' => 'required',
        'city' => 'required',
        'post' => 'required'
    ]);

    Mail::send('emails.posting-message', $request->all(), function($mail) use($request) 
            $mail->from($request->email, $request->name);
            $mail->to('helloworld@gmail.com')->subject('Contact Message');
    );
    return redirect()->back()->with('flash_message', 'Thank you for your message');

现在在 emails/posting-message.blade.php 中,您将可以访问 $name、$email、$number、$city、$post 以及您在请求中发送的任何其他输入.


现在,如果您想恢复验证的错误。用这个

$validator = Validator::make($request->all(), [
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
]);
if ($validator->fails()) 
    //you can get the errors with $validator->errors. and redirect/mail as you want.

//here the inputs are valid.

【讨论】:

以上是关于如何在 Laravel 中填充 HTML 表单中的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 从视图中的表单填充数据库表并将其显示在同一视图中

如何使laravel中的动态表单字段可填写

laravel 5.2 中的表单模型绑定

Laravel 5.2 如何使用多选填充编辑表单?

如何从Laravel中的数据库记录中填充下拉菜单项

在 Laravel 5.3 中使用相同的表单进行创建和编辑