在Laravel 5中创建新表单并提交它们



我想澄清一下使用Laravel 5.2和Bootstrap 3将新表单正确提交到我的数据库的步骤。

我使用 Laravel 的默认值正确设置了登录/注册页面,并且它们工作正常。我现在想要创建一个可供经过身份验证的用户访问的用户配置文件页面。我在数据库中使用一行来存储他们的所有用户信息。一些字段是在注册期间填写的,现在我希望他们能够访问其他字段(同时限制对某些注册字段(如用户名)的访问)。

在下面的示例代码中,有一些字段用于上传个人照片、输入名字和输入姓氏。(这些都没有在注册期间完成。

我已经做了什么(所有代码都在下面):

  1. 创建视图配置文件.刀片.php
  2. 创建控制器配置文件控制器.php
  3. 更新路由.php在控制器目录中。

注意:

  1. 当我尝试提交如下所示的表单时,我收到类型错误:传递给 App\Http\Controllers\ProfileController::update() 的参数 1 必须是数组类型,没有给出。

要使此页面正常工作,接下来需要执行哪些步骤?

profile.blade.php:

@extends('layouts.app')
@section('content')
<div class="container" style="padding-top: 30px;">
  <h1 class="page-header">User Profile</h1>
  <div class="row">
    <!-- left column -->
    <div class="col-md-4 col-sm-6 col-xs-12">
      <div class="text-center">
        <i class="fa fa-user fa-5x"></i>
        <h6>Please upload a photo...</h6>
        <input type="file" class="text-center center-block well well-sm">
      </div>
    </div>
    <!-- edit form column -->
    <div class="col-md-8 col-sm-6 col-xs-12 personal-info">
      <form class="form-horizontal" role="form" method="POST" action="{{ url('/profile') }}">
      {!! csrf_field() !!}
        <div class="form-group">
          <label class="col-lg-3 control-label">First name:</label>
          <div class="col-lg-8">
            <input class="form-control" value="<?php echo Auth::user()->firstname; ?>" id="firstname" name="firstname" placeholder="First..." type="text">
          </div>
        </div>
        <div class="form-group">
          <label class="col-lg-3 control-label">Last name:</label>
          <div class="col-lg-8">
            <input class="form-control" value="<?php echo Auth::user()->lastname; ?>" id="lastname" name="lastname" placeholder="Last..." type="text">
          </div>
        </div>
        <div class="form-group">
          <label class="col-md-3 control-label"></label>
          <div class="col-md-8">
            <button type="submit" class="btn btn-primary">
              <i class="fa fa-btn fa-user"></i>Submit
            </button>
            <span></span>
            <input class="btn btn-default" value="Cancel" type="reset">
          </div>
        </div>
      </form>
    </div>
  </div>
</div>
@endsection

配置文件控制器.php:

<?php
namespace AppHttpControllers;
use AppHttpRequests;
use IlluminateHttpRequest;
class ProfileController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }
    /**
     * Show the application dashboard.
     *
     * @return IlluminateHttpResponse
     */
    public function index()
    {
        return view('profile');
    }
    protected function update(array $data)
    {
        return User::update([
            'firstname' => $data['firstname'],
            'lastname' => $data['lastname'],
        ]);
    }
}

我在路由中间件中添加了以下内容:

Route::get('/profile', 'ProfileController@index');
Route::post('/profile', 'ProfileController@update');

这是协议不匹配,因为您正在发布表单。您需要将路线更改为

route::post('/profile', 'ProfileController@index');

使用验证器是个好主意,因为它将确保您的输入正是您需要的,并且填写了所有必填字段。

您的更新函数应如下所示:

public function update(Request $request)
{
    $first_name = $request->input('firstname');
    $last_name = $request->input('lastname');
    $id = Auth::user()->id;
    $user = AppUser::find($id);
    $user->firstname = $first_name;
    $user->lastname = $last_name;
    $user->save();
    return view('profile');
    // Sanitize, validate, before you do ANYTHING with update
    // Instead of returning the update result, you can instead show another view or forward them to another page.
}

最新更新