刀片无法访问请求错误(Laravel 5.2)

Cyb*_*ova 9 php laravel-5.2

我使用laravel已经好几个月但从未遇到过这样的问题.

我已经创建了一个简单的Request类来验证更新用户请求,如果遵循验证规则,该请求可以正常工作.如果验证规则失败,我们应该回到上一页并显示html中的所有错误.

据我,我已经正确地写入一切为我所用的其他应用程序来写,但$errors似乎是在刀片难以接近

以下是我需要调试的代码片段:

routes.php文件

Route::group(['middleware' => ['web']], function () {
    Route::get('/users/{id}/edit', 'UserController@edit');
    Route::post('/users/{id}/edit', 'UserController@update');
});
Run Code Online (Sandbox Code Playgroud)

UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Requests\UserUpdateRequest;
use App\Models\User;
use App\Models\Role;
use App\Models\Post;

class UserController extends Controller
{    
    public function edit($id)
    {
        try {
            $user = User::find($id);
            $roles = Role::all();
            return view('users.edit', compact(['user', 'roles']));
        }catch(Exception $e) {
            return view('errors.500', compact(['e']));
        }
    }

    public function update($id, UserUpdateRequest $request)
    {
        dd($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

UserUpdateRequest.php

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class UserUpdateRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name'      =>  'required|string|min:4',
            'email'     =>  'required|email',
            'role'      =>  'required|numeric',
            'password'  =>  'required',
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

edit.blade.php

@extends('master')

@section('title') Edit Users @stop

@section('content')
<div class="row">
    <div class="col-sm-12">
        <h2>Edit User</h2>
    </div>
</div>
<div class="alert alert-warning alert-dismissible" role="alert">
  @foreach($errors->all() as $error)
  {{ $error }}
  @endforeach
</div>
<form action="{{ url('/users/'.$user->id.'/edit') }}" method="post">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <div class="col-sm-6">
        <div class="form-group">
            <label>Name</label>
            <input type="text" name="name" value="{{ $user->name }}" class="form-control" placeholder="Name">
        </div>
    </div>
    <div class="col-sm-6">
        <div class="form-group">
            <label>Email Address</label>
            <input type="text" name="email" value="{{ $user->email }}" class="form-control" placeholder="Email Address">
        </div>
    </div>
    <div class="col-sm-6">
        <div class="form-group">
            <label>Role</label>
            <select name="role" class="form-control">
            @foreach($roles as $role)
            @if($role->id == $user->role)
            <option value="{{ $role->id }}" selected>{{ $role->name }}</option>
            @else
            <option value="{{ $role->id }}">{{ $role->name }}</option>
            @endif
            @endforeach
            </select>
        </div>
    </div>
    <div class="col-sm-6">
        <div class="form-group">
            <label>Password</label>
            <input type="password" name="password" class="form-control" placeholder="New Password">
        </div>
    </div>
    <div class="col-sm-12">
        <div class="form-group">
            <input type="submit" class="btn btn-info btn-block" value="Update">
        </div>
    </div>
</form>
@stop
Run Code Online (Sandbox Code Playgroud)

浏览器上的HTML响应是空白的.我也尝试过<?php dd($errors); ?>显示以下内容

Edit User

ViewErrorBag {#168 ?
  #bags: []
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

sho*_*ild 5

@VipindasKS 的假设是正确的。从 Laravel 5.2.28 版本开始,所有的路由都通过 RouteServiceProviders 的方法包含了 web 中间件:

protected function mapWebRoutes(Router $router)
{
    $router->group([
        'namespace' => $this->namespace, 'middleware' => 'web',
    ], function ($router) {
        require app_path('Http/routes.php');
    });
}
Run Code Online (Sandbox Code Playgroud)

由于该版本 Laravel 的默认 routes.php 文件仅包含:

Route::get('/', function () {
    return view('welcome');
});
Run Code Online (Sandbox Code Playgroud)

所以如果你从以前的版本升级,它会有一个 routes.php 文件,如下所示:

Route::group(['middleware' => ['web']], function () {
   // web routes
});
Run Code Online (Sandbox Code Playgroud)

您的应用程序将正常工作,因为使用 Composer 更新您不会触及您的 RouteServiceProvider(它不添加 mapWebRoutes() 方法)。因此,“web”中间件仅添加到“web”组内的路由中。

但是,如果您正在拉新安装的 Laravel(当前为 5.2.29)并且有一个 routes.php

Route::group(['middleware' => ['web']], function () {
   // web routes
});
Run Code Online (Sandbox Code Playgroud)

Web 中间件堆栈将两次添加到路由中。您可以通过以下方式检查:

php artisan route:list
Run Code Online (Sandbox Code Playgroud)

这将显示“web”中间件添加了两次:

| POST      | users/{id}/edit          |                  | App\Http\Controllers\UserController@update      | web,web    |
Run Code Online (Sandbox Code Playgroud)

这打破了 Session 的 flash 变量,因为它们通常只打算在一个会话生命周期中持续。

所以解决办法是:

如果你拉了一个新的 laravel 实例,不要在 routes.php 文件中使用 'web' 中间件组。