【问题标题】:How to populate the fields from HTML form in Laravel?如何在 Laravel 中填充 HTML 表单中的字段?
【发布时间】: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() 函数的用法。把时间花在它上面,伙计。这是完全值得的。

标签: php laravel forms laravel-5.4 contact-form


【解决方案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.
              

              【讨论】:

                猜你喜欢
                • 2012-08-11
                • 1970-01-01
                • 2019-07-27
                • 1970-01-01
                • 2018-09-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多