2016-11-20 2 views
2

Ich benutze Laravel 5.3. Mein erstes Laravel-Projekt/Lernerfahrung In meiner Blade-Datei verwende ich das folgende Snippet, um die Fehler unter einem Feld nach einer PUT oder POST-Anfrage anzuzeigen.

In diesem Fall wird das Datenbankfeld wird vorName genannt

 @if ($errors->has('firstName')) 
      <span class="help-block"> 
       <strong>{{ $errors->first('firstName') }}</strong> 
      </span> 
     @endif 

Nun, da ich viele Felder haben, ich habe Wiederholungen diesen Block für jedes Feld halten. Ich sah die Laravel docs auf Blade-Vorlagen (Erweiterung Blade-Abschnitt) und dachte, ich

public function boot() 
{ 
    // 
    Blade::directive('showIfError', function($fieldName) { 
     if ($errors->has('$fieldName')) { 
      echo "<span class='help-block'> 
      <strong> $errors->first('$fieldName') </strong> 
      </span>"; 
     } 
    }); 
} 

die folgenden in der AppServiceProvider Klasse (AppServiceProvider .php) tun könnte, und verwenden Sie dann

@showIfError ('firstname')

aber kein Glück ... ich den Fehler ‚nicht definierte Variable: Fehler‘

Sieht aus wie die Fehlersammlung Laravel ist in dieser Ansicht Datei nicht zugänglich.

Schätzen Sie jede Hilfe. Vielen Dank.

+0

Können Sie bitte hinzufügen, was Sie erreichen möchten? – Abrar

+0

Ich möchte nicht den if (errors ...) -Block für jedes Feld in meinem Formular kopieren und einfügen.Stattdessen möchte ich eine Makro/Blade-Vorlage wie @showIfError ('fieldName') und die endgültige Ausgabe wird wie der oben angegebene Span-Block gerendert. –

+0

Ich finde, dass View Caching die Ausgabe stört. Wenn ich alle Dateien im Speicher (Cache) Ordner lösche, kann ich dies mit der Sitzung ('Fehler') funktionieren, aber es funktioniert nur einmal! Wenn Sie das Formular erneut mit den gleichen Fehlern einreichen, wird keine Ausgabe erzeugt. Aus diesem Grund kann ich nicht vollständig testen, ob eine der Antworten funktioniert :-( Zusätzlich die Blade :: directive Funktion nimmt nicht 2 Argumente. –

Antwort

1

Die Sache ist $errors in nicht zugänglich in Schließung. Außerdem können Sie kein ganzes Objekt übergeben, da die Direktive closure nur die Zeichenfolge akzeptiert. Mit einfachen Daten können Sie implode() und dann explode() es, aber nicht mit einem Objekt oder einer Sammlung.

Was Sie tun können, ist $errors manuell innerhalb der Schließung zu erstellen.

Ich habe es getestet und es funktioniert wie erwartet:

Blade::directive('showIfError', function($fieldName) { 
    $errors = session('errors'); 

    if ($errors->has($fieldName)) { 
     return "<span class='help-block'>".$errors->first($fieldName)."</span>"; 
    } 
}); 
0

Das Problem ist, dass die $ errors Variable in den Ansichten nur verfügbar ist. Wenn Sie sich die Middleware ansehen, die die Variable teilt (https://github.com/laravel/framework/blob/5.0/src/Illuminate/View/Middleware/ShareErrorsFromSession.php), werden Sie sehen, dass sie in der Sitzung gespeichert ist.

So können Sie darauf zugreifen, wie folgt:

$errors = session()->get('errors'); 

Hinweis in Ihrem Beispiel Sie ein paar andere Fragen zu tun haben; Die Variable $ fieldName sollte nicht in Anführungszeichen stehen. ZB:

public function boot() { 
Blade::directive('showIfError', function($fieldName) { 
$errors = session()->get('errors'); 
if ($errors->has($fieldName)) { 
     echo "<span class='help-block'> <strong>". $errors->first($fieldName). "</strong> </span>"; 
} 
}); 
} 
0

Ich schrieb schließlich eine PHP-Funktion in meiner Ansicht und rufen Sie es mit verschiedenen Feldnamen. Ich hoffe, das ist ein guter Ansatz. Nicht sicher, was der beste Weg ist, dies zu implementieren.

function showIfError($fieldName) 
{ 
    $errors=session('errors'); 
    if (count($errors)>0) { 
     if (session('errors')->has($fieldName)) { 
      $msg=$errors->first($fieldName); 
      echo '<span class="help-block"> 
        <strong>'. $msg.' </strong> 
       </span>'; 
     } 
    } 

} 
2

Dies ist eine späte Antwort, aber hoffentlich wird es einer anderen Person helfen, die mitkommt. Eine benutzerdefinierte Blade-Anweisung soll einen String-PHP-Code zurückgeben, der ausgewertet wird, wenn die Vorlage gerendert wird. Da die $errors Variable nur verfügbar ist, wenn die Antwort erfolgt, wird es nicht versuchen, es in der Direktive auszuwerten. Die Lösung ist dies:

// custom blade directive to render the error block if input has error 
// put this inside your service provider's boot method 

    \Blade::directive('errorBlock', function ($input) { 
      return 
       '<?php if($errors->has('.$input.')):?> 
        <div class=\'form-control-feedback\'> 
         <i class=\'icon-cancel-circle2\'></i> 
        </div> 
        <span class=\'help-block\'> 
          <strong><?php echo $errors->first('.$input.') ?></strong> 
        </span> 
       <?php endif;?>'; 
     });