php - instalacion - laravel tutorial
Laravel: el almacén de sesiones no está configurado bajo petición (10)
¿Puedes usar
->stateless()
antes de
->redirect()
?
Entonces ya no necesitas la sesión.
Recientemente creé un nuevo proyecto de Laravel y seguí la guía sobre Autenticación. Cuando visito mi ruta de inicio de sesión o registro, aparece el siguiente error:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:/Users/Matthew/Documents/test/resources/views/auth/register.blade.php)
No he editado ningún archivo principal de Laravel, solo he creado las vistas y agregado las rutas a mi archivo routes.php
// Authentication routes
Route::get(''auth/login'', [''uses'' => ''Auth/AuthController@getLogin'', ''as'' => ''login'']);
Route::post(''auth/login'', [''uses'' => ''Auth/AuthController@postLogin'', ''as'' => ''login'']);
Route::get(''auth/logout'', [''uses'' => ''Auth/AuthController@getLogout'', ''as'' => ''logout'']);
// Registration routes
Route::get(''auth/register'', [''uses'' => ''Auth/AuthController@getRegister'', ''as'' => ''register'']);
Route::post(''auth/register'', [''uses'' => ''Auth/AuthController@postRegister'', ''as'' => ''login'']);
No tengo mucha experiencia con Laravel, así que disculpe mi ignorancia. Soy consciente de que hay otra pregunta que hace esta misma pregunta, pero ninguna de las respuestas parece funcionar para mí. ¡Gracias por leer!
Editar:
Aquí está mi register.blade.php según lo solicitado.
@extends(''partials.main'')
@section(''title'', ''Test | Register'')
@section(''content'')
<form method="POST" action="/auth/register">
{!! csrf_field() !!}
<div class="ui input">
<input type="text" name="name" value="{{ old(''name'') }}" placeholder="Username">
</div>
<div class="ui input">
<input type="email" name="email" value="{{ old(''email'') }}" placeholder="Email">
</div>
<div class="ui input">
<input type="password" name="password" placeholder="Password">
</div>
<div class="ui input">
<input type="password" name="password_confirmation"placeholder="Confirm Password">
</div>
<div>
<button class="ui primary button" type="submit">Register</button>
</div>
</form>
@endsection
Deberá utilizar el middleware web si necesita estado de sesión, protección CSRF y más.
Route::group([''middleware'' => [''web'']], function () {
// your routes here
});
En mi caso (usando Laravel 5.3) agregar solo los siguientes 2 middleware me permitió acceder a los datos de la sesión en mis rutas API:
-
/App/Http/Middleware/EncryptCookies::class
-
/Illuminate/Session/Middleware/StartSession::class
Declaración completa (
$middlewareGroups
en Kernel.php):
''api'' => [
/App/Http/Middleware/EncryptCookies::class,
/Illuminate/Session/Middleware/StartSession::class,
''throttle:60,1'',
''bindings'',
],
En mi caso, agregué las siguientes 4 líneas a $ middlewareGroups (en app / Http / Kernel.php):
''api'' => [
/App/Http/Middleware/EncryptCookies::class,
/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse::class,
/Illuminate/Session/Middleware/StartSession::class,
/App/Http/Middleware/VerifyCsrfToken::class,
''throttle:60,1'',
''bindings'',
],
IMPORTANTE: ¡Las 4 líneas nuevas deben agregarse ANTES de ''acelerador'' y ''enlaces''!
De lo contrario, se generará el error "El token CSRF no coincide". He luchado en esto durante varias horas solo para encontrar que el pedido es importante.
Esto me permitió acceder a la sesión en mi API. También agregué VerifyCsrfToken ya que cuando se trata de cookies / sesiones, CSRF debe ser atendido.
Si agregar sus
routes
dentro del
web middleware
no funciona por alguna razón, intente agregar esto a
$middleware
en
Kernel.php
protected $middleware = [
//...
/Illuminate/Session/Middleware/StartSession::class,
/Illuminate/View/Middleware/ShareErrorsFromSession::class,
];
Si está utilizando CSRF, ingrese
''before''=>''csrf''
En su caso
Route::get(''auth/login'', [''before''=>''csrf'',''uses'' => ''Auth/AuthController@getLogin'', ''as'' => ''login'']);
Para obtener más detalles, consulte la documentación de Laravel 5 Rutas de protección de seguridad
Si la respuesta de Cas Bloem no se aplica (es decir, definitivamente tiene el middleware
web
en la ruta correspondiente), es posible que desee verificar el orden de los middlewares en su Kernel HTTP.
El orden predeterminado en
Kernel.php
es este:
$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,
],
];
Tenga en cuenta que
VerifyCsrfToken
viene después de
StartSession
.
Si los tiene en un orden diferente, la dependencia entre ellos también puede hacer que el
Session store not set on request.
excepción.
Un problema puede ser que intente
acceder a su sesión dentro de la función
__constructor()
de su controlador.
Desde Laravel 5.3+ esto ya no es posible porque no está destinado a funcionar de todos modos, como se indica en la guía de actualización .
En versiones anteriores de Laravel, podía acceder a las variables de sesión o al usuario autenticado en el constructor de su controlador. Esto nunca tuvo la intención de ser una característica explícita del marco. En Laravel 5.3, no puede acceder a la sesión o al usuario autenticado en el constructor de su controlador porque el middleware aún no se ha ejecutado.
Para obtener más información de antecedentes también lea Taylor su respuesta.
Solución alternativa
Si aún desea usar esto, puede crear dinámicamente un middleware y ejecutarlo en el constructor, como se describe en la guía de actualización:
Como alternativa, puede definir un middleware basado en Closure directamente en el constructor de su controlador. Antes de usar esta función, asegúrese de que su aplicación esté ejecutando Laravel 5.3.4 o superior:
<?php namespace App/Http/Controllers; use App/User; use Illuminate/Support/Facades/Auth; use App/Http/Controllers/Controller; class ProjectController extends Controller { /** * All of the current user''s projects. */ protected $projects; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware(function ($request, $next) { $this->projects = Auth::user()->projects; return $next($request); }); } }
en mi caso fue solo para devolver; al final de la función donde he establecido sesión
Laravel [5.4]
Mi solución fue usar el ayudante de sesión global: session ()
Su funcionalidad es un poco más difícil que $ request-> session () .
escritura :
session([''key''=>''value'']);
empujando :
session()->push(''key'', $notification);
recuperando :
session(''key'');