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.

War es hilfreich?

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 sein MessageBag.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top