Domanda

Sto usando Laravel Framework 4.1.30.

Come si passano i dati da un modello a un altro senza passare attraverso il percorso o il controller?

Specifiche:Ho ottenuto un modello di pannello "Principale" che viene esteso da un modello di pannello "Accedi".Il mio obiettivo è inserire eventuali errori visualizzati nel modello "Accedi" e visualizzarli in una sezione a piè di pagina del modello "Principale".

I miei codici per il modello principale all'interno del tag "body" sono i seguenti (nota che esistono alcuni codici in mezzo per formattare la mia vista):

<!-- 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

Il modello del blade che chiama Main è codificato in questo modo:

@extends('layout.main')

@section('content')

    ... more code here / input fields ...

    {{ $errors->first('email')}}

    ... more code here / input fields ...

@stop

A quanto ho capito (abbastanza nuovo per Laravel) il contenuto deve essere letto prima della visualizzazione globale della sessione.

Speravo che una semplice variabile che passa tra i template sarebbe sufficiente (se esiste) per risolvere il problema.Desidero trasferire il valore di errore dal contenuto al modello principale nella parte della sezione piè di pagina senza tornare al controller.

Sono consapevole che esistono soluzioni alternative, ad esempio invece di attendere che il controller restituisca gli errori al modello, potrei passare gli errori direttamente alla variabile globale tramite la sessione (o il layout) dal Controller.Attualmente ho implementato il seguente codice funzionante, ma mi chiedo solo cosa succederebbe se i dati fossero già passati al modello.

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

Il motivo per cui lo faccio è che originariamente il mio codice sul controller è proprio come...

        if ($validator->fails()) {

           return Redirect::route('account-sign-in')
              ->withErrors($validator)
              ->withInput();

Adesso sembra così grandeImmagino che se potessi alleviare il controller con un loop, il mio programma sarebbe più efficiente.

È stato utile?

Soluzione

Dal Documentazione Laravel (sottolineano il loro):

Tuttavia, tieni presente che non dobbiamo associare esplicitamente i messaggi di errore alla vista nel nostro percorso GET.Questo perché Laravel controllerà sempre la presenza di errori nei dati della sessione e li collegherà automaticamente alla vista se sono disponibili. Quindi, è importante notare che an $errors sarà sempre disponibile in tutte le tue visualizzazioni, ad ogni richiesta, consentendoti di presupporre comodamente che la variabile $errors sia sempre definita e possa essere utilizzata in sicurezza.IL $errors la variabile sarà un'istanza di MessageBag.

Perché Laravel Redirect... withErrors() fa questo, non è necessario aggiungere nuovamente manualmente gli errori alla Session.Invece di controllare if (Session::has('global')), fai semplicemente questo:

<!-- Serving as Error Notification/footer -->
@foreach ($errors as $error)
    <p>{{ $error }}</p>
@endforeach

Questo dovrebbe funzionare nonostante è nel layout e non nella visione reale, perché vincolante errors all'interno del modello li applica anche all'esterno dello stesso.

Se non ci sono errori, Laravel salterà semplicemente quel blocco.Se sono presenti errori, verranno automaticamente associati al file $errors variabile e verrà reso come previsto.

Altri suggerimenti

I originariamente stava scrivendo una risposta che raccomandava Visualizza compositori , ma poi -Leggi la domanda e credo che cosa devi fare è astratta la convalida del modulo a una classe "forma":

interface FormInterface {
    public function isValid($input);
    public function errors();
}
.

L'idea di base che ho ottenuto dalla tua domanda è che vuoi che il tuo controller assomigli a questo tipo:

public function postSignIn()
{
    if(!$this->_signinForm->isValid(Input::all())) {
        return Redirect::route('account-sign-in')
            ->withErrors($this->_signinForm->errors())
            ->withInput()
        ;
    }

    // Non-error logic branch
}
.

La classe del modulo contenga fondamentalmente un riferimento all'oggetto del validatore. Tutto il metodo isValid dovrebbe fare è fondamentalmente chiamare passes() sul validatore e tutto il metodo error restituirà semplicemente i risultati della chiamata errors() sul validatore.

I Onestamente non ho idea del motivo per cui stai combinando tutti i messaggi di errore in una singola variabile, lo presgo perché li vuoi visti tutti visualizzati nello stesso posto. Se questo è il caso ed è così che vuoi che gli errori funzioni, puoi costruirlo nel metodo errors del tuo modulo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top