Ошибки запроса недоступны в 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 или в контроллере, если у нас нет пользовательского промежуточное программное обеспечение. Но, не уверен, что это вызвало проблему.