php - for - Laravel 5.2 $ errores no aparecen en Blade
laravel exception (11)
Así que sigo el tutorial básico de Laravel 5 y estoy atascado en la validación de formularios. He seguido exactamente con el tutorial, pero obtengo una variable Indefinida: errores en mi vista de creación de artículos.
En el tutorial que estoy siguiendo y lo que he encontrado en línea dicen que la variable de errores siempre está ahí en el archivo Blade para que la use, así que no sé qué estoy haciendo mal.
¡Cualquier ayuda sería apreciada! amando a Laravel excepto por este error!
View
@if($errors->any())
<ul class="alert alert-danger">
@foreach($errors->any() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
@endif
Controlador
<?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'');
}
}
Validar solicitud
<?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'',
];
}
}
-
Simplemente elimine
, ''middleware'' => ''web''
deRoute::group(array(''prefix'' => ''user'', ''middleware'' => ''web''), function()
en la página routes.php O -
Movimiento
/Illuminate/Session/Middleware/StartSession::class, /Illuminate/View/Middleware/ShareErrorsFromSession::class,
Desde
protected $middlewareGroups
a
protected $middleware
en la página
kernel.php
Como dice la documentación de Laravel:
Nota: Si su copia de Laravel tiene un RouteServiceProvider que ya incluye el archivo de rutas predeterminado dentro del grupo de middleware web, no necesita agregar manualmente el grupo a su archivo routes.php.
Entonces, eliminar del archivo
routes.php
sería la forma correcta.
A partir de 5.2,
routes.php
es llamado por defecto en el contexto de un
[''middleware''=>''web'']
por
RouteServiceProvider
.
Pero en la generación predeterminada de
routes.php
de rutas de autenticación, la llamada de
Route::group
todavía está sucediendo de manera predeterminada, por lo que si elimina esa declaración de
Route::group
de
routes.php
la aplicación muestra correctamente los errores.
Cambie
@foreach($errors->any() as $error)
a
@foreach($errors->all() as $error)
Esta es la solución:
Cambie la definición de sus grupos de ruta con un middleware , de :
Route::group([''middleware'' => ''web''], function () {
a
Route::group([''middlewareGroups'' => ''web''], function () {
Este es un problema importante con la actualización 5.2.
Lo que sucede es que el middleware que es responsable de hacer que la variable de
errors
esté disponible para todas sus vistas no se está utilizando porque se movió del middleware global al grupo de middleware
web
.
Hay dos formas de solucionar esto:
-
En su archivo
kernel.php
, puede mover el middleware/Illuminate/View/Middleware/ShareErrorsFromSession::class
nuevo a la propiedadprotected $middleware
. -
Puede envolver todas sus rutas web con un grupo de rutas y aplicarles el middleware
web
.Route::group([''middleware'' => ''web''], function() { // Place all your web routes here... });
Publicar esto como podría ser útil para otros,
Como Smartrahat mencionó en la 1ra solución, en su archivo
Kernel.php
(
app/Http/Kernel.php
) mueva
/Illuminate/View/Middleware/ShareErrorsFromSession::class
de
$middlewareGroups
a la propiedad
protected $middleware
, pero lo mismo comenzará a arrojar el error "Almacén de sesión no establecido a petición",
para resolver este movimiento
/Illuminate/Session/Middleware/StartSession::class,
a la
$middleware property
también.
Teniendo requisitos web y API en nuestra aplicación, no queríamos mover el middleware; quizás eso hubiera funcionado, sin embargo:
Tuvimos la situación muy peculiar de que los datos de la sesión
flash[]
y
$errors
se transmitieron correctamente entre los métodos estándar de recursos laravel,
store()
y
edit()
, pero en algunos casos los datos no volvieron a través de métodos casi idénticos,
storeSale()
y
editSale()
.
Descubrimos que en nuestros entornos de desarrollo e implementación, los controladores de sesión ''archivo'' y ''base de datos'' funcionaban en todos los casos, pero el controlador ''cookie'' no.
Cambiar al controlador de la base de datos en todas las instancias resolvió el problema.
Un par de observaciones sobre este tema. Primero, hay un error relacionado en github con respecto a este problema PFA github.com/laravel/framework/issues/12022
Si miras el último comentario que escribió Graham, creo que esa es la cara que estaba enfrentando. Para mí, aunque hubo un error en los datos de publicación de formularios, estaba obteniendo la siguiente igualdad
boolval(count($errors) === 0) === true
En mi caso, agregué declaraciones de registro en el
/Illuminate/Session/Middleware/StartSession::class
la clase de middleware anterior se ejecutó dos veces para una solicitud determinada, no estoy seguro de por qué se ejecutó dos veces, pero creo que debido a esto, la variable
$errors
se está restableciendo.
Estaba usando esta configuración (que creo que vino por defecto con [email protected])
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,
];
Cambié la configuración que funcionó para mí y el recuento de la variable
$errors
no es cero (también el middleware anterior se ejecutó solo una vez por solicitud)
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,
];
Nota: Todas mis rutas están en el grupo de middleware
web
antes y después del cambio de configuración de Kernel.php, no moví mis rutas del grupo de middleware
web
.
en este caso,
laravel 5.2
puede consultar un código de ejemplo y editar su archivo
kernal.php
.
mueva esto
/Illuminate/View/Middleware/ShareErrorsFromSession::class
, forme
middlewareGroups
a
middleware
y agregue
/Illuminate/Session/Middleware/StartSession::class
, a
middleware
entonces funciona correctamente.
simplemente tienes que moverte:
/Illuminate/Session/Middleware/StartSession::class,
/Illuminate/View/Middleware/ShareErrorsFromSession::class,
desde
protected $middlewareGroups
protected $middleware
Resuelto
Puede cambiar cualquiera de los siguientes:
1. ponga su ruta de trabajo
(app/http/routes.php)
en
Route::group([''middleware'' => [''web'']], function () { // Here like Route::get(''/'', ''TodoController@index''); Route::post(''/'', ''TodoController@store''); });
Captura de pantalla -
2. Mueva su
protected $middlewareGroups web
(app/Http/Kernel.php)
en
protected $middleware = []
Captura de pantalla -