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

8
我是一名有用的助手,可以为您翻译文本。
我正在构建一个表单,希望从表单中填充字段(我已经命名为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这一行中,在验证中没有message。但是如果我使用

'msg'=> $request->name (它会返回name)

我想知道我应该在控制器中做出什么改变,以使其返回验证中存在的每个字段。

我尝试过这个,但它只返回最后一个值,也就是post。

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

IMO 是什么意思? - flash
在我看来。 :) - Rafael
听我说, Laravel 是我使用过的最精细的框架之一。它没有捷径。你需要学习它。我建议你按照他们建议的教程去做,在这个链接 https://laravel-news.com/your-first-laravel-application 中间提到了 old() 函数的用法。花时间去学习吧,这是完全值得的。 - Rafael
你是否有一个名为“message”的表单字段? - Akbar Mirsiddikov
尝试添加一个消息规则('message' => 'string'). - Aabir Hussain
显示剩余2条评论
8个回答

10

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

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

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

重定向后,要获取名称为title的表单字段的值,您可以使用old()帮助程序,例如:

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

你也可以向辅助函数传递第二个参数:

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

你懂的。


1
OP并不是在询问闪存消息,而是在询问联系表单中的字段名称为“message”的消息,在控制器中无法获取其值。 - Veerendra

2

听起来你想做的是将表单提交的所有输入传递给名为posting-message的Laravel Blade模板,该模板用于构建电子邮件。

如果我的理解是正确的,那么你已经接近成功了——这只需要让更多变量通过电子邮件Blade模板。目前,你只传递了一个名为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提供了一些检索方式,例如:批量检索输入
$allInputs = $request->all();

p.p.s. 请考虑对您表单中的每个输入进行更多验证,以确保用户提供的数据符合您的期望,并且不会包含恶意或不正确的内容。


2

首先,您需要检查HTML中的字段名称是否准确无误,无空格或拼写错误。

其次,请使用$request->all();检查所有发布字段,并查看在POST数组中是否有“message”索引。

如果您没有在验证中添加该字段,则不会出现上述情况。

但是,由于您正在处理联系表单,因此应将“message”字段设置为必填项,并将其添加到验证中。这样,您将始终在消息字段中获取一些数据。

请问您能否在问题中同时发布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');
    });

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

0
您提供的代码片段如下:
   '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;

0

首先,使用redirect时不需要使用back方法,back()函数会自动重定向用户。

return back()->with('key','Val');

看看这个:旧输入

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

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

如果您已经看过Laravel的默认注册和登录页面,您就会知道可以使用old()助手基于cookie和session获取以前的值。


   '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');
});

0

你需要在返回的响应中添加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会自动将用户重定向回到他们之前的位置。此外,所有验证错误都会自动地闪存到session中。请参阅文档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>

0

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

请尝试以下方法:

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.

0

我之前也遇到过类似的问题,经过多次尝试后,我将字段名从message更改为comments,问题得以解决。

我怀疑message可能是框架在会话中使用的变量名之一。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接