在默认的Laravel应用程序中更新用户数据

时间:2018-06-27 11:47:43

标签: php laravel laravel-5

我刚刚开始使用Laravel,我无法解决这个问题……我希望更多有经验的人可以在这里发现我所犯的错误。

我配置了一个新的laravel应用程序并执行

php artisan make:auth

按照以下说明进行操作 https://laravel.com/docs/5.6/authentication#authentication-quickstart

这些都是routes/web.php中的所有路线:

Route::get('/', 'HomeController@show');
Route::get('/user', ['as'=>"user", 'uses'=>'UserController@show']);
Route::post('/user/update', ['as' => 'user.update', 'uses' => 'UserController@update']);

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

这是我的UserController.php

<?php

namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
  public function show() {

    return view('user')->withUser(Auth::user());
  }
  public function update(Request $request)
    {
        $user = Auth::user();
        $user->name=$request->input('name');
        $user->email=$request->input('email');

        $user->save();
        return Redirect::route('user');
    }
}

这是我的user.blade.php中的表格:

{!! Form::model($user, ['route' => ['user.update'], 'method' => 'POST']) !!}
<tr><th colspan=2>My data</th></tr>
  <tr>
      <td>Name</td>
      <td>{!! Form::text('name', null, ['class' => 'form-control']) !!}</td>
  </tr>
  <tr>
      <td>E-mail address</td>
      <td>{!! Form::text('email', null, ['class' => 'form-control']) !!}</td>
  </tr>
  <tr><td colspan=2>{!! Form::submit('Submit', ['class' => 'btn btn-primary']) !!}</td></tr>
{!! Form::close() !!}

当我单击表单中的“提交”按钮时似乎什么也没发生...数据库中的数据未更改。

更新

  • 不会触发控制器。我在dd()函数中添加了update(),但这不会产生任何结果。

  • 我尝试了composer du,清除了浏览器缓存并尝试了另一个浏览器。我使用php artisan migrate:fresh更新了迁移,然后再次注册。同样的问题。 debug设置为true,如果更改,则会收到其他错误。我将项目添加到github仓库中:github.com/EsthervdS/LaravelTest

  • 我重新安装了一个新项目,该问题再次出现。

3 个答案:

答案 0 :(得分:1)

更改以下行:

$user = Auth::user();

$userDetails = Auth::user();  // To get the logged-in user details
$user = User::find($userDetails ->id);  // Find the user using model and hold its reference
$user->name=$request->input('name');
$user->email=$request->input('email');

$user->save();  // Update the data

Auth::user();中包含已登录的用户数据,即我们大部分放置在会话中的数据,但是要更新用户数据,您必须使用模型实例或查询构建器。

答案 1 :(得分:1)

在查看您的 user.blade.php 后,

发现您正在表中使用表单,这就是阻止表单提交的原因。我也发现了更多的错误。所以我改进了。

发现错误:

  • 在表格内提交表单
  • 重复的路线名称
  • 没有用于用户路由的身份验证中间件
  • 无数据验证
  • 使用错误的使用声明

user.blade.php

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">Profile</div>
                    <div class="card-body">

                        @if($errors)
                            @foreach($errors->all() as $error)
                                <div class="alert alert-danger" role="alert">
                                    {{ $error }}
                                </div>
                            @endforeach
                        @endif

                        {!! Form::model($user, ['route' => ['user.update'], 'method' => 'POST']) !!}
                            <div class="form-group row">
                                <label for="name" class="col-sm-2 col-form-label">Name</label>
                                <div class="col-sm-10">
                                    {!! Form::text('name', null, ['class' => 'form-control', 'id' => 'name']) !!}
                                </div>
                            </div>

                            <div class="form-group row">
                                <label for="email" class="col-sm-2 col-form-label">Email</label>
                                <div class="col-sm-10">
                                    {!! Form::text('email', null, ['class' => 'form-control', 'id' => 'email']) !!}
                                </div>
                            </div>

                            <div class="form-group">
                                {!! Form::submit('Submit', ['class' => 'btn btn-primary']) !!}
                            </div>

                        {!! Form::close() !!}
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

我不是Laravel集体的忠实粉丝

UserController.php

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class UserController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function show()
    {
        return view('user', ['user' => Auth::user()]);
    }

    /**
     * @param Request $request
     * @return
     */
    public function update(Request $request)
    {
        // Get current user
        $userId = Auth::id();
        $user = User::findOrFail($userId);

        // Validate the data submitted by user
        $validator = Validator::make($request->all(), [
            'name' => 'required|max:255',
            'email' => 'required|email|max:225|'. Rule::unique('users')->ignore($user->id),
        ]);

        // if fails redirects back with errors
        if ($validator->fails()) {
            return redirect()->back()
                ->withErrors($validator)
                ->withInput();
        }

        // Fill user model
        $user->fill([
            'name' => $request->name,
            'email' => $request->email
        ]);

        // Save user to database
        $user->save();

        // Redirect to route
        return redirect()->route('user');
    }
}

web.php

<?php

// Auth routes
Auth::routes();

// User account routes
Route::get('user', 'UserController@show')->name('user');
Route::post('user/update', 'UserController@update')->name('user.update');

// other routes
Route::get('/', function () {
    return view('welcome');
})->name('welcome');

Route::get('/home', 'HomeController@index')->name('home');

额外提示 我建议使用laravel authorization policies。 并且如果您还希望仅将欢迎路由用于身份验证用户,则只需将身份验证中间件添加到欢迎路由-laravel docs

答案 2 :(得分:0)

我克隆了您的代码,它正在我的身边工作。 请尝试作曲家du或清除浏览器缓存。或提供更多信息。