如何在 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->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
方法和redirect
,back()
函数无论如何都会重定向用户。
return back()->with('key','Val');
看看这个:Old Input
正如其他人所说,要将查询字符串/输入发送到 cookie,请根据文档使用 withInput()
函数,它将刷新所有当前输入:
return back()->with('key','Val')->withInput();
如果你看过 Laravel 的默认注册和登录刀片,你就会知道你可以使用 old()
帮助器根据 cookie 和会话获取以前的值。
'msg'=> $request->name,
'msg'=> $request->email,
'msg'=> $request->number,
'msg'=> $request->city,
'msg'=> $request->post
给数组赋值有一些方法,但记住永远不要像这样覆盖它们!
您可以使用自动索引方法,如果您使用$msg[] = $request->bar
,它将索引从0到分配长度的值
$data[] = $request->val1;
$data[] = $request->val2;
...
但您也可以像这样确定每个元素的键:
$data['name'] = $request->name;
$data['email'] = $request->email;
...
毕竟,如果您想将所有输入作为第二个参数发送,只需使用$request->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 表单中的字段?的主要内容,如果未能解决你的问题,请参考以下文章