Ошибки запроса недоступны в blade (Laravel 5.2)
прошло много месяцев с тех пор, как я использую laravel, но никогда не сталкивался с такой проблемой.
Я сделал простой класс запроса для проверки запроса пользователя обновления, который отлично работает, если соблюдаются правила проверки. Если правило проверки не выполняется, мы должны вернуться на предыдущую страницу и отобразить все ошибки в html.
по-моему, я написал все правильно, как я писал в других приложениях, но the $errors
кажется недоступным в блейд!--13-->
Ниже приведены мои необходимые фрагменты кода для отладки:
маршруты.в PHP
Route::group(['middleware' => ['web']], function () {
Route::get('/users/{id}/edit', 'UserController@edit');
Route::post('/users/{id}/edit', 'UserController@update');
});
UserController.в PHP
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppHttpRequests;
use AppHttpRequestsUserUpdateRequest;
use AppModelsUser;
use AppModelsRole;
use AppModelsPost;
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);
}
}
UserUpdateRequest.в PHP
<?php
namespace AppHttpRequests;
use AppHttpRequestsRequest;
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',
];
}
}
правка.лезвие.в 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
ответ HTML в браузере пуст.
Я также пытался <?php dd($errors); ?>
, который отображается следующее
Edit User
ViewErrorBag {#168 ▼
#bags: []
}
Подробнее здесь
2 ответов
@VipindasKS прав в своем предположении. Начиная с Laravel версии 5.2.28 веб-промежуточное программное обеспечение включено во все маршруты через метод RouteServiceProviders:
protected function mapWebRoutes(Router $router)
{
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
require app_path('Http/routes.php');
});
}
начиная с этой версии Laravel по умолчанию маршруты.php-файл содержит только:
Route::get('/', function () {
return view('welcome');
});
поэтому, если вы обновляетесь с предыдущей версии, у которой есть маршруты.php файл такой:
Route::group(['middleware' => ['web']], function () {
// web routes
});
ваше приложение будет просто работать нормально, потому что с обновлением композитора вы не коснетесь RouteServiceProvider (он не добавляет метод mapWebRoutes ()). Таким образом, промежуточное программное обеспечение " web "добавляется только к маршрутам в группе "web".
однако, если вы тянете новую установку Laravel (в настоящее время 5.2.29 ) и имеете маршруты.php с
Route::group(['middleware' => ['web']], function () {
// web routes
});
стек веб-промежуточного ПО будет добавлен дважды к маршрутам. Вы можете проверить это через:
php artisan route:list
который покажет, что промежуточное ПО " web " добавляется дважды:
| POST | users/{id}/edit | | App\Http\Controllers\UserController@update | web,web |
этот прерывает переменные flash сеанса, поскольку они обычно предназначены только для одного жизненного цикла сеанса.
таким образом, решение:
не используйте группу промежуточного программного обеспечения " web " в маршрутах.php-файл, если вы вытащил свежий экземпляр laravel.
вы можете использовать перенаправление withErrors, в случае сбоя проверки
if ($validator->fails()) {
return redirect()
->route('route.here')
->withErrors($validator)
->withInput();
}
кроме того, пожалуйста, проверьте
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
есть ли в промежуточном по " web " в app/Http/Kernel.в PHP
Итак, ваше ядро.php должен выглядеть примерно так:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
если это тоже не работает, вы можете переместить
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
к глобальному промежуточному по. (просто попробовать. Я не буду предлагать)
* * убедитесь, что сеансы работают. Для возврата ошибок или флэш-сообщения в браузере, вам нужно иметь сеанс работает.
С 5.2 сеансы начинаются только в том случае, если вы укажете, что маршрут должен использовать промежуточное ПО " web " (что уже сделано вами в маршрутах.РНР.)
и, начиная с 5.2.28, веб-промежуточное ПО автоматически включается во все маршруты, вы можете увидеть это в RouteServiceProvider. таким образом, мы не хотим указывать "веб -" промежуточное ПО для маршрутов.php или в контроллере, если у нас нет пользовательского промежуточное программное обеспечение. Но, не уверен, что это вызвало проблему.