Wie übergebe ich Werte zwischen Vorlagen in Laravel?[geschlossen]
Frage
Ich verwende Laravel Framework 4.1.30.
Wie übergibt man Daten von einer Vorlage an eine andere, ohne die Route oder den Controller zu durchlaufen?
Besonderheiten:Ich habe eine Blade-Vorlage „Haupt“ erhalten, die um eine Blade-Vorlage „Anmelden“ erweitert wird.Mein Ziel ist es, alle Fehler, die in der Vorlage „Anmelden“ auftreten, einzufügen und in einem Fußzeilenbereich der Vorlage „Haupt“ anzuzeigen.
Meine Codes für die Hauptvorlage innerhalb des „body“-Tags lauten wie folgt (beachten Sie, dass dazwischen einige Codes vorhanden sind, um meine Ansicht zu formatieren):
<!-- Serving as Header -->
@include('layout.navigation')
<!-- Serving as left content/status displays -->
@include('layout.frameleft')
<!-- Serving as right content/entry point -->
@yield('content')
<!-- Serving as Error Notification/footer -->
@if (Session::has('global'))
{{ Session::get('global') }}
@endif
Die Blade-Vorlage, die Main aufruft, ist wie folgt codiert:
@extends('layout.main')
@section('content')
... more code here / input fields ...
{{ $errors->first('email')}}
... more code here / input fields ...
@stop
So wie ich es verstehe (ziemlich neu für Laravel), wird der Inhalt zuerst gelesen, bevor die Sitzung global angezeigt wird.
Ich hatte gehofft, dass eine einfache Variablenübergabe zwischen Vorlagen ausreichen würde (falls vorhanden), um das Problem zu lösen.Ich möchte den Fehlerwert vom Inhalt zurück an die Hauptvorlage im Fußzeilenabschnitt übergeben, ohne zum Controller zurückzukehren.
Ich bin mir bewusst, dass es Workarounds gibt. Anstatt darauf zu warten, dass der Controller die Fehler an die Vorlage ausgibt, könnte ich die Fehler direkt vom Controller über eine Sitzung (oder an ein Layout) an eine globale Variable übergeben.Derzeit habe ich den folgenden Arbeitscode implementiert, aber ich frage mich nur, was passiert, wenn die Daten bereits an die Vorlage übergeben wurden.
public function postSignin() {
$validator = Validator::make(Input::all(),
array(
'email' => 'required|email',
'password' => 'required'
)
);
if ($validator->fails()) {
$errors = $validator->errors();
$formErrors = 'Errors: ';
foreach($errors->all() as $error ) {
$formErrors .= sprintf("%s", $error);
}
return Redirect::route('account-sign-in')
->withErrors($validator)
->withInput()
->with('global',$formErrors);
} else {
...more codes here...
Der Grund, warum ich das tue, ist, dass mein Code auf dem Controller ursprünglich genau wie folgt aussieht:
if ($validator->fails()) {
return Redirect::route('account-sign-in')
->withErrors($validator)
->withInput();
Jetzt scheint es so groß zu sein.Ich denke, wenn ich den Controller mit einer Schleife entlasten könnte, wäre mein Programm effizienter.
Lösung
Von dem Laravel-Dokumentation (Hervorhebung von ihnen):
Beachten Sie jedoch, dass wir die Fehlermeldungen nicht explizit an die Ansicht in unserer GET-Route binden müssen.Dies liegt daran, dass Laravel die Sitzungsdaten immer auf Fehler prüft und diese automatisch an die Ansicht bindet, wenn sie verfügbar sind. Daher ist es wichtig zu beachten, dass ein
$errors
Die Variable ist bei jeder Anfrage immer in allen Ihren Ansichten verfügbar, sodass Sie bequem davon ausgehen können, dass die Variable $errors immer definiert ist und sicher verwendet werden kann.Der$errors
Variable wird eine Instanz von seinMessageBag
.
Weil Laravel's Redirect... withErrors()
Wenn die Methode dies tut, müssen Sie die Fehler nicht noch einmal manuell zur Sitzung hinzufügen.Anstatt nach zu suchen if (Session::has('global'))
, machen Sie einfach Folgendes:
<!-- Serving as Error Notification/footer -->
@foreach ($errors as $error)
<p>{{ $error }}</p>
@endforeach
Das sollte funktionieren wenngleich es ist in der layout
und nicht in der tatsächlichen Ansicht, denn das gilt verbindlich errors
innerhalb der Vorlage werden sie auch außerhalb angewendet.
Wenn keine Fehler vorliegen, überspringt Laravel diesen Block einfach.Wenn Fehler vorliegen, werden diese automatisch an die gebunden $errors
variabel und wird wie erwartet gerendert.
Andere Tipps
Ich habe ursprünglich eine Antwort geschrieben, die empfohlen wurde Komponisten anzeigen, aber dann habe ich die Frage noch einmal gelesen und glaube, dass Sie die Formularvalidierung in eine „Formular“-Klasse abstrahieren müssen:
interface FormInterface {
public function isValid($input);
public function errors();
}
Die Grundidee, die ich aus Ihrer Frage gewonnen habe, ist, dass Ihr Controller etwa so aussehen soll:
public function postSignIn()
{
if(!$this->_signinForm->isValid(Input::all())) {
return Redirect::route('account-sign-in')
->withErrors($this->_signinForm->errors())
->withInput()
;
}
// Non-error logic branch
}
Ihre Formularklasse enthält grundsätzlich einen Verweis auf das Validatorobjekt.All die isValid
Die Methode sollte grundsätzlich aufrufen passes()
auf dem Validator und all dem error
Die Methode gibt einfach die Ergebnisse des Aufrufs zurück errors()
auf dem Validator.
Ich habe ehrlich gesagt keine Ahnung, warum Sie tatsächlich alle Fehlermeldungen in einer einzigen Variablen zusammenfassen. Ich gehe davon aus, dass das daran liegt, dass Sie möchten, dass sie alle an derselben Stelle angezeigt werden.Wenn dies der Fall ist und Sie möchten, dass die Fehler so funktionieren, können Sie dies in Ihre Formulare integrieren errors
Methode.