Поэтому я следую инструкциям по основам Laravel 5, и я придерживаюсь проверки формы. Я внимательно следил за учебником, но получаю неопределенную переменную: ошибки в моем представлении статей.
В учебном пособии, за которым я слежу, и что я нашел в Интернете, они говорят, что переменная ошибок всегда присутствует в файле кликов для использования, поэтому я не знаю, что я делаю неправильно?
Любая помощь будет оценена! любящий Laravel, за исключением этой ошибки!
View @if($errors->any()) <ul class="alert alert-danger"> @foreach($errors->any() as $error) <li>{{$error}}</li> @endforeach </ul> @endif
контроллер
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; use App\Http\Requests; use App\Http\Requests\UserRequest as UserRequest; // use App\Http\Requests\CreateArticleRequest as CreateArticleRequest; use App\Http\Controllers\Controller; use Illuminate\View\Middleware\ErrorBinder; class UserController extends Controller { public function create(){ return view('pages.signUp'); } public function store(UserRequest $request){ User::create($request->all()); return 'the user has been registered!'; return view('user.profile'); } }
Проверка запроса
<?php namespace App\Http\Requests; use App\Http\Requests\Request; class UserRequest 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', 'email' => 'required|email', 'country' => 'required', 'password' => 'required|min:6', 'confirm_password' => 'required|same:password', 'height' => 'required', 'weight' => 'required', ]; } }
Это проблема с обновлением 5.2. То, что происходит, – это промежуточное программное обеспечение, которое отвечает за то, чтобы переменная errors
доступная ко всем вашим представлениям, не использовалась, поскольку она была перенесена из глобального промежуточного программного обеспечения в группу промежуточного программного обеспечения.
Есть два способа исправить это:
В файле kernel.php
вы можете переместить промежуточное ПО \Illuminate\View\Middleware\ShareErrorsFromSession::class
обратно в свойство protected $middleware
объекта protected $middleware
.
Вы можете объединить все свои веб-маршруты с группой маршрутов и применить к ним web
промежуточное программное обеспечение.
Route::group(['middleware' => 'web'], function() { // Place all your web routes here... });
решаемая
Вы можете изменить любое из следующих действий:
1. поместите свой рабочий маршрут (app/http/routes.php)
на
Route::group(['middleware' => ['web']], function () { // Here like Route::get('/', 'TodoController@index'); Route::post('/', 'TodoController@store'); });
Скриншот –
2. Переместите protected $middlewareGroups web
(app/Http/Kernel.php)
на protected $middleware = []
Скриншот –
Это решение:
Измените защиту групп маршрутов промежуточным программным обеспечением :
Route::group(['middleware' => 'web'], function () {
в
Route::group(['middlewareGroups' => 'web'], function () {
просто, вам нужно двигаться:
\Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,
от protected $middlewareGroups
до protected $middleware
Просто удалите , 'middleware' => 'web'
из Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()
на странице route.php OR
Переехать
\Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,
От protected $middlewareGroups
до protected $middleware
на странице karnel.php
Как пишет Laravel Documentation:
Примечание. Если в вашей копии Laravel есть RouteServiceProvider, который уже содержит файл маршрутов по умолчанию в группе промежуточного программного обеспечения, вам не нужно вручную добавлять группу в файл route.php.
Поэтому удаление из файла routes.php
будет правильным.
Проводя это, поскольку это может быть полезно для других,
Как указано в 1-м решении Kernel.php
, в вашем файле Kernel.php
( app/Http/Kernel.php
) переместите \Illuminate\View\Middleware\ShareErrorsFromSession::class
из $middlewareGroups
в protected $middleware
свойство protected $middleware
, но оно начнет бросать ошибка «Хранилище сеансов не установлено по запросу»,
для разрешения этого перехода \Illuminate\Session\Middleware\StartSession::class,
в $middleware property
.
Начиная с 5.2, routes.php
по умолчанию уже вызывается в контексте ['middleware'=>'web']
помощью RouteServiceProvider
. Но при генерации маршрутов auth маршрутов по умолчанию routes.php
умолчанию по-прежнему происходит Route::group
вызов Route::group
поэтому, если вы удалите это объявление Route::group
из routes.php
приложение корректно отображает ошибки.
Несколько замечаний по этому вопросу. Во-первых, связанная ошибка в github по этой проблеме PFA https://github.com/laravel/framework/issues/12022
Если вы посмотрите на последний комментарий, который написал Грэм, я думаю, что это лицо, с которым я столкнулся. Для меня, несмотря на то, что в сообщениях формы были ошибки, я получал следующее равенство
boolval(count($errors) === 0) === true
В моем случае я добавил записи журнала в
\Illuminate\Session\Middleware\StartSession::class
вышеупомянутый класс промежуточного программного обеспечения выполнялся дважды для данного запроса, я не уверен, почему он работал дважды, но я думаю, из-за этого переменная $errors
получает сброс. Я использовал эту конфигурацию (которая, я думаю, по умолчанию была отключена Laravel @ 5.2.43)
protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, ]; 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', ], ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ];
Я изменил конфигурацию, которая сработала для меня, и количество переменных $errors
не равно нулю (также указанное промежуточное ПО запускалось только один раз за запрос)
protected $middleware = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, ]; protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', ], ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ];
Примечание. Все мои маршруты находятся в группе промежуточного программного обеспечения web
до и после изменения конфигурации Kernel.php, я вообще не перемещал свои маршруты из группы промежуточного программного обеспечения.
Измените @foreach($errors->any() as $error)
на @foreach($errors->all() as $error)
в этом случае laravel 5.2 вы можете ссылаться на код примера и редактировать файл kernal.php
. переместите этот \Illuminate\View\Middleware\ShareErrorsFromSession::class
middlewareGroups
для middleware
middlewareGroups
middleware
и добавьте \Illuminate\Session\Middleware\StartSession::class
, в middleware
затем его работу корректно.
Имея требования к Web и API в нашем приложении, мы не хотели перемещать промежуточное ПО; возможно, это сработало бы:
У нас была очень странная ситуация, что данные сеанса flash[]
и $errors
были правильно переданы между стандартными методами ресурса laravel, store()
и edit()
, но в некоторых случаях данные не возвращались к почти идентичным методам, storeSale()
и editSale()
.
Мы обнаружили, что в наших средах разработки и развертывания во всех случаях работали драйверы «файл» и «база данных», но драйвер «cookie» этого не делал.
Переключение на драйвер базы данных во всех случаях решило проблему.