2015-05-30 6 views
7

Ho un sito Web composto da 2 diversi moduli di accesso a 2 posizioni, uno sulla barra di navigazione e l'altro una pagina di accesso che verrà utilizzata quando il sistema rileva un visitatore non registrato.Reindirizzamento di convalida personalizzato di Laravel 5

Posso chiedere cosa ho fatto di sbagliato nel mio LoginRequest.php dove ho impostato una condizione per reindirizzare a una pagina di login personalizzata se c'è qualche tipo di errore nel processo di login? Ho i miei codici come di seguito:

<?php namespace App\Http\Requests; 

use App\Http\Requests\Request; 

class LoginRequest 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 [ 
     'login_email'    => 'required', 
     'login_password'   => 'required' 
     ]; 
    } 


    public function messages() 
    { 
     return [ 
      'login_email.required'   => 'Email cannot be blank', 
      'login_password.required'  => 'Password cannot be blank' 
     ]; 
    } 

    public function redirect() 
    { 
     return redirect()->route('login'); 
    } 
} 

Il codice supponiamo di reindirizzare gli utenti che accedono dalla barra di navigazione se c'è qualche errore nella pagina di accesso, ma non sembra per reindirizzare.

Grazie.

risposta

6

Trovato soluzioni. Tutto quello che devi fare è quello di ignorare la risposta iniziale da

FormRequest.php

come tali e funziona come un fascino.

public function response(array $errors) 
{ 
    // Optionally, send a custom response on authorize failure 
    // (default is to just redirect to initial page with errors) 
    // 
    // Can return a response, a view, a redirect, or whatever else 

    if ($this->ajax() || $this->wantsJson()) 
    { 
     return new JsonResponse($errors, 422); 
    } 
    return $this->redirector->to('login') 
     ->withInput($this->except($this->dontFlash)) 
     ->withErrors($errors, $this->errorBag); 
} 
+0

Ottima risposta. Il parametro 'array' assomiglia all'output di' $ errors = $ validator-> errors() 'in termini di struttura (ma i metodi ad esempio $ errors-> all() potrebbero non essere abbastanza usati su di esso). Quindi per ottenere tutti gli errori come array, usa la funzione helper 'array_flatten ($ errors)' – gthuo

1

se si desidera reindirizzare a un URL specifico, quindi utilizzare protected $redirect

class LoginRequest extends Request 
{ 
    protected $redirect = "/login#form1"; 

    // ... 
} 

o se si desidera reindirizzare ad un percorso di nome, quindi utilizzare $redirectRoute

class LoginRequest extends Request 
{ 
    protected $redirectRoute = "session.login"; 

    // ... 
} 
+0

In realtà è completamente valido in L5.4 – manix

1

Se utilizzano il metodo validate() su Controller

$this->validate($request, $rules); 

quindi è possibile sovrascrivere il buildFailedValidationResponse dal tratto presente sulla base Controller estendere.

Qualcosa lungo questa linea:

protected function buildFailedValidationResponse(Request $request, array $errors) 
{ 
    if ($request->expectsJson()) { 
     return new JsonResponse($errors, 422); 
    } 

    return redirect()->route('login'); 
} 
0

Se non si desidera utilizzare il metodo validate su richiesta, è possibile creare un'istanza del validatore manualmente utilizzando la facciata Validator. Il metodo make sulla facciata genera una nuova istanza di validatore: fare riferimento a

public function store(Request $request) 
    { 
    $validator = Validator::make($request->all(), [ 
     'title' => 'required|unique:posts|max:255', 
     'body' => 'required', 
    ]); 

    if ($validator->fails()) { 
     return redirect('post/create') 
        ->withErrors($validator) 
        ->withInput(); 
    } 

    // Store the blog post... 
    }