2015-02-22 18 views
12

Attualmente ho un modello che ha un campo di testo e un campo di lumaca.Convalida di uno slug univoco durante l'aggiornamento in Laravel 5

ho verificare che la lumaca è unico nella mia forma classe richiesta:

public function rules() 
{ 
    return [ 
     'name' => 'required|min:3', 
     'slug' => 'required|alpha_dash|unique:questions' 
    ]; 
} 

Questo funziona bene su Crea e correttamente nega la creazione di lumache duplicati. Tuttavia, nel mio metodo di aggiornamento, non mi consente di salvare un record perché lo slug esiste già. Ovviamente lo slug esiste, ma esiste sul record che si sta modificando, quindi mi piacerebbe continuare a consentirne il salvataggio. Tuttavia, non dovrebbe essere in grado di essere trasformato in una lumaca su un altro record.

Ecco ciò che il mio metodo di aggiornamento ArticlesController assomiglia:

public function update(Article $article, ArticleRequest $request) 
{ 
    $article->update($request->all()); 

    return redirect('articles'); 
} 

C'è un modo per fare questo lavoro in L5?

+0

Ho intenzione di lasciarlo aperto per ora per vedere quali altre opzioni esistono, ma ho risolto questo rimuovendo la mia convalida e utilizzando Eloquent Sluggable: https://github.com/cviebrock/eloquent-sluggable – Rapture

risposta

3

In unique rule è possibile specificare l'ID che si desidera ignorare.

È possibile creare 2 richiesta separata (uno per creare e uno per l'aggiornamento), ma si può fare anche in questo modo verificare se se è impostato (presumo l'aggiornamento URL assomiglia /questions/2):

public function rules() 
{ 
    $rules = [ 
     'name' => 'required|min:3', 
     'slug' => ['required', 'alpha_dash'] 
    ]; 

    $rule = 'unique:questions'; 

    $segments = $this->segments(); 
    $id = intval(end($segments)); 
    if ($id != 0) { 
     $rule .= ',slug,' . $id; 
    } 
    $rules['slug'][] = $rule; 

    return $rules; 
    } 
} 
+0

Penso che la mia soluzione è un po 'più pulita! (ma essenzialmente lo stesso) –

2

Se si deve avere la possibilità di aggiornare una lumaca, i progetti su cui ho lavorato solitamente richiedono che non sia modificabile dopo la creazione, quindi è possibile utilizzare la regola integrata di laravel per ignorare un determinato record sulla tabella per chiave primaria.

$rules['slug'] = "required|unique:questions,slug,{$id}"; 

http://laravel.com/docs/5.0/validation vedere "Forzare una regola unica per ignorare un dato ID"

0

Come già accennato è possibile utilizzare la funzione di ignorare nella funzionalità validatore.

Basta fare riferimento all'id dell'elemento che si desidera ignorare e assicurarsi che quando si aggiorna si usi una richiesta di patch!

Vedi maggiori informazioni qui! http://laravel.com/docs/5.0/validation#rule-unique

protected $rules = [  
    'name' => 'required|min:3', 
    'slug' => 'required|alpha_dash|unique:questions' 
]; 

public function rules() 
{ 
    $rules = $this->rules; 
    if ($this->isMethod('patch')) 
    { 
     $id = $this->articles; 
     $rules['slug'] = $rules['slug'].',slug,'.$id; 
    } 
    return $rules; 
} 
2

tentare di modificare la regola come segue (in forma di classe richiesta):

public function rules() 
{ 
    return [ 
     'name' => 'required,min:3', 
     'slug' => 'required|alpha_dash|unique:categories,slug,'.$this->id') 
    ]; 
} 

Funziona per me.

+1

fa '$ this-> id' si basa sull'oggetto' Request' che ha un parametro chiamato 'id' nel percorso? Come '/ whatever/{id}'. Se fosse '/ whatever/{whatever_id}' userei '$ this-> whatever_id'? –

1

Ecco come lo faccio in laravel 5.3 in dettaglio:

1- Creare un nuovo modulo di richiesta classe eseguendo il comando successivo nel vostro terminale:

php artisan make:request ArticleFormRequest 

Dove ArticleFormRequest è il nome della classe di richiesta del modulo. Questo comando creerà un file chiamato ArticleFormRequest.php nella directory app/Http/Requests.

2- aperta che ha creato il file e rimuovere il suo contenuto quindi posizionare la prossima contenuti in esso:

<?php 

namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 
use Illuminate\Http\Request; 
use Illuminate\Validation\Rule; 
use App\Article; 

class ArticleFormRequest extends FormRequest 
{ 
    protected $rules = [ 
     'name' => 'required|min:3', 
     'slug' => 'required|alpha_dash|unique:articles,slug', 
    ]; 

    // protected $user; // in case you want the current authenticated user 
    protected $request_method; 
    protected $id; 

    public function __construct(Request $request) 
    { 
     // $request->user() returns an instance of the authenticated user 
     // $this->user = $request->user(); // in case you want the current authenticated user 

     // $request->method() returns method of the request (GET, POST, PUT, DELETE, ...) 
     $this->request_method = strtoupper($request->method()); 

     // segments(): Returns an array containing all of the segments for the request path 
     // it is important to assign the returned "segments" array to a variable first before using it, otherwise an error will occur 
     $segments = $request->segments(); 
     // note this way will be valid only if "id" of the element is the last segment 
     $this->id = end($segments); 
    } 

    /** 
    * 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() 
    { 
     $rules = $this->rules; 

     if ($this->request_method == "POST") { 
      // do nothing.. 
     } elseif (in_array($this->request_method, ["PUT", "PATCH"])) { 
      $article = Article::find($this->id); 

      if ($article) { 
       // forcing a unique rule to ignore a given id | https://laravel.com/docs/5.3/validation 
       $rules["slug"] = [ 
        "required", 
        "alpha_dash", 
        Rule::unique("articles", "slug")->ignore($article->id, "id"), 
       ]; 

       // this is also can be used 
       // $rules['slug'] = "required|alpha_dash|unique:articles,slug,$article->id,id"; 
      } 
     } 

     return $rules; 
    } 
} 

3- Nel vostro controller, è possibile utilizzare tale ArticleFormRequest in store() e update() metodi come questo:

<?php 

namespace App\Http\Controllers; 

use App\Http\Requests\ArticleFormRequest; 

class ArticlesController extends Controller 
{ 


    public function store(ArticleFormRequest $request) 
    { 
     // your code here.. 
    } 

    public function update(ArticleFormRequest $request, $id) 
    { 
     // Your code here.. 
    } 

} 
0

In EditArticleRequest:

public function $rules() 
{ 
    $id = $this->id; 

    return [ 
     'name' => 'required|min:3', 
     'slug' => "required|alpha_dash|unique:articles,slug,$id", 
    ]; 
}