2017-06-13 4 views
9

blade.phpLaravel mit Benutzerfunktion

...... 
<tr> 
    <td>{{ Form::label('cameraMac', 'Mac: ') }}</td> 
    <td>{{ Form::text('cameraMac')}}</td> 
</tr> 
...... 

controller.php

$data = Input::all(); 
function transform($cameraMac) { 
    return strtoupper($cameraMac); 
} 

//validation here 

$user = User::find($data['user_id']); 

if($data["cameraMac"]) 
{ 
    $user->camera_id = transform($data["cameraMac"]); 
    Cloud_camera::create(['id' => transform($data["cameraMac"]), 'user_id' => $user->id]); 
} 

$user->save(); 

ich brauche die cameraMac validieren zu Primärschlüssel zu transformieren, in db zu speichern. Wie kann ich die Funktion transform() in der Validierungsregel 'nullable|unique:cloud_cameras,id|size:6' verwenden. Das heißt, wie kann ich diese Funktion im Validierungsprozess aufrufen?

Antwort

3

sein, wenn Sie irgendwie die Eingangsdaten umwandeln müssen Sie können die merge Methode verwenden:

Input::merge(['cameraMac' => transform(Input::get('cameraMac')]); 
$this->validate(Input::getFacadeRoot(), [ 
    'cameraMac' => 'nullable|unique:cloud_cameras,id|size:6' 
]); 

Als persönliche Präferenz I w ould statt Illuminate\Http\Request $request im Regler Verfahren typ hint und dann

$request->merge(['cameraMac' => transform($request->cameraMac)]); 
$this->validate($request, ['cameraMac' => 'nullable|unique:cloud_cameras,id|size:6' 
]); 
+0

gibt es eine Möglichkeit, diese Funktion im Validator aufzurufen, nicht die Daten zuerst zu übertragen. –

+0

@KrisRoofe Ja, Sie könnten eine benutzerdefinierte ["Formularanforderung"] (https://laravel.com/docs/5.4/validation#form-request-validation) erstellen, in die Sie Ihre Validierungs- und Autorisierungslogik einfügen und auch überschreiben können die Methode 'validationData' und führe die' merge' dort durch. – alepeino

1

Sind Sie sicher, dass das Feld cameraMac als (mehr oder weniger) Primärschlüssel nullfähig sein soll?

Sie sollten auch die int Validierung für die Verwendung der size Validierung verwenden.
Der dritte Parameter von uniquevalidation ist der except, der die angegebene ID ignoriert.

Ihre Validierung im Controller so aussehen

$except_id = $request->input('cameraMac', null); 

$this->validate($request, [ 
    'cameraMac' => 'nullable|unique:cloud_cameras,id,'.$except_id.'|int|size:6' 
]); 

One example könnte, wie Sie Fehler Ihrer Validierung in den Ansichten zeigen können, wird diese

@if (count($errors) > 0) 
    <div class="alert alert-danger"> 
     <ul> 
      @foreach ($errors->all() as $error) 
       <li>{{ $error }}</li> 
      @endforeach 
     </ul> 
    </div> 
@endif 
+0

Ja, es ist ein Primärschlüssel. Beim Beenden wird eine neue Kamera erstellt. Und an einen Benutzer binden. Wenn nicht, ist die Kamera-ID des Benutzers null. –

1

Vorerst I trans die Eingangsdaten zuerst, es dann in der folgenden Art und Weise validieren.

Aber ich suche eine Möglichkeit, diese Funktion in der Validierung zu nennen.

$data = Input::all(); 
$data['cameraMac'] = transform($data['cameraMac']); 
$rules = array(
    'id' => 'required|unique:cloud_printers,id|size:6', 
    'cameraMac' => 'unique:cloud_cameras,id|size:6', 
); 
$validator = Validator::make($data, $rules); 
if ($validator->fails()) 
    return Redirect::back()->withInput()->withErrors($validator); 
+0

Die Validierungsregel soll ein Objekt mit einem anderen oder einer Regel vergleichen. Es ist nicht da, um die Daten zu transformieren, bevor Sie sie vergleichen.Warum willst du es dort haben, also sieht es schöner aus? und sollte es in der Datenbank in Großbuchstaben gespeichert werden? Wenn ja, müssen Sie es vorher transformieren. – mimo

+0

@mimo Die obere Transformation ist nur ein einfaches Beispiel, tatsächlich verschlüssle ich einige davon. –

+1

Sie wollen es nur für die Validierung umwandeln und dann sollte es wieder normal sein? Sie könnten ein benutzerdefiniertes Validierungs-Tag schreiben und die gesamte Validierung durchführen. – mimo

2

ich defining a middleware betrachten würde.

Die Middleware führt die Transformation durch und fügt das Ergebnis zurück zur Anfrage, bevor sie den Controller anspricht.

class TransformId { 
    public function handle(Request $request, Closure $next) { 
     // shout out to @alepeino 
     $request->merge(['cameraMac' => transform($request->cameraMac)]); 

     return $next($request); 
    } 
} 
1

können Sie eine custom validation rule definieren:

Validator::extend('transformUpper', function ($attribute, $value, $parameters, $validator) { 
    return strtoupper($value); 
}); 

Dann die neue Regel in der Anfrage wie gewohnt verwenden:

$this->validate($request, [ 
    'cameraMac' => 'required|transformUpper' 
]); 
+0

Wie kann ich die benutzerdefinierte Validierung und die eindeutige Validierung zusammen verwenden? Ich möchte, dass der transformierte CameraMac in der Datenbank einzigartig ist. –

+0

Validator Rückgabe wahr oder falsch, ich glaube nicht, dass Ihr Code den Eingabewert von cameraMac ändern wird. –

Verwandte Themen