我使用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)
更多信息在这里
@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' 中间件组。
| 归档时间: |
|
| 查看次数: |
2822 次 |
| 最近记录: |