2016-07-28 16 views
0

Ich speichere filenames + their extensions unter filename Spalte in der files Tabelle. Mein Problem ist, dass seit nur der Name im $request Objekt ohne die entsprechende Erweiterung vorhanden ist, kann ich den Dateinamen nicht mit der eindeutigen Validierungsregel validieren, ohne zuerst an den Eingabedaten zu basteln. Beispiel:Eindeutige Validierung einer Teilkette in Laravel

// . . . 
$this->validate($request, [ 
    // Suppose the name of uploaded file is 'file'. 
    // The below rule will NEVER fail, because in the 
    // database, similar file will be stored as 'file.txt', 
    // thus 'file' != 'file.txt' 
    'filename' => 'unique:files' 
]); 
// . . . 

Gibt es eine Möglichkeit, den Dateinamen zu validieren, ohne sein Suffix (Erweiterung) in der Datenbank zu ignorieren?

+0

Wo in Ihrem Code fügen Sie eine Erweiterung an den Dateinamen an? –

+0

@ MarcoAurélioDeleu nach Validierung übergeben, verkette ich den Dateinamen und seine Erweiterung und speichern Sie sie in der Datenbank. Das ist ein ziemlich bulliger Code, ist es wirklich nötig, hier gepostet zu werden? –

+0

Das hängt davon ab, dass ich eine Lösung für Sie haben kann, aber es hängt davon ab, dass Sie die Strategie ändern, was bedeutet, dass Sie die Erweiterung NACH der Validierung nicht mehr anhängen und das VORHER tun müssen. –

Antwort

1

können Sie versuchen, die all() Methode in Ihrer Request Klasse außer Kraft zu setzen und Ihre Erweiterung vor der Validierung anhängen statt nach. Das wäre so etwas sein

public function all() { 
    $data = parent::all();   // Get all the data in your request 
    $data['filename'] .= '.txt'; // Concatenate the file extension 

    return $data;   // DONT FORGET TO RETURN THE CHANGED DATA 
} 

Nun wird die Regel richtig, da es für die Datei mit die Erweiterung suchen. Erinnerung: Sie werden aufhören müssen, um die Erweiterung in Ihrem Controller-Anhänge oder welche auch immer Ort, den Sie, dies zu tun verwenden, sonst werden Sie mit filename.txt.txt am Ende und werden 1 bis Platz

Persönlich finde ich es wieder ein wenig chaotisch die all() Methode außer Kraft zu setzen, wenn ich Lust dazu habe, so ich habe folgendes Merkmal

trait SanitizeRequest { 

    protected $sanitized = false; 

    public function all() { 
     return $this->sanitize(parent::all()); 
    } 

    protected function sanitize(array $inputs) { 
     if ($this->sanitized) return $inputs; 

     foreach ($inputs as $field => $value) { 
      if (method_exists($this, $field)) 
       $inputs[$field] = $this->$field($value); 
     } 
     $this->replace($inputs); 
     $this->sanitized = true; 
     return $inputs; 
    } 

} 

Diese Eigenschaft mir eine eigene Methode mit dem Feldnamen schreiben kann, wenn ich es vor der Validierung sanieren will. Mit diesem Ansatz können Sie eine Methode wie folgt haben

class YourRequest extends Request { 

    use SanitizeRequest; 

    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() { 
     return true; 
    } 

    ... 

    protected function filename($value) { 
     return $value . '.txt'; 
    } 

} 
+0

Sie sind der MVP. Danke für die tolle Lösung! –