Question

Je suis à l'aide de Laravel Cadre 4.1.30.

Comment faites-vous passer des données à partir d'un modèle à l'autre sans passer par la route ou le contrôleur?

Spécificités:J'ai eu un "Principal" de la lame modèle qui est prolongé par un "Sign-in" de la lame de modèle.Mon objectif est de mettre toutes les erreurs qui s'affiche dans la partie "connexion" modèle et affiché ce pour une section de pied de page de la "main" du modèle.

Mes codes pour le modèle principale à l'intérieur du "corps" de la balise sont comme suit (notez que certains codes existent entre le format de mon point de vue):

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

La lame modèle de l'appel de la Principale est codé comme suit:

@extends('layout.main')

@section('content')

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

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

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

@stop

Si je comprends bien (assez nouveau pour Laravel) le contenu est à lire en premier avant de la session d'affichage global.

Je l'espérais, une simple variable de passage entre le modèle serait suffisante (si elle existe) pour résoudre le problème.Je souhaite passer la valeur de l'erreur à partir du contenu sur le modèle de la section de pied de page de la partie sans revenir à la manette.

Je suis au courant qu'il ya des solutions de rechange, comme au lieu d'attendre pour le régulateur à sortie les erreurs de modèle, j'ai pu passer les erreurs directement à la variable globale par session (ou de mise en page) à partir du Contrôleur.Actuellement les suivants code de travail est ce que j'ai mis en œuvre, mais je me demandais simplement si les données ont été transmises déjà au modèle.

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

Pourquoi je fais ce qui est à l'origine de mon code au niveau du contrôleur est tout comme..

        if ($validator->fails()) {

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

Maintenant, il semble si grand.Je me dis que si je peux soulager le contrôleur avec une boucle, mon programme serait plus efficace.

Était-ce utile?

La solution

À partir de la Laravel documentation (l'emphase est la sienne):

Toutefois, notez que nous n'avons pas explicitement lier les messages d'erreur à l'affichage dans notre itinéraire.C'est parce que Laravel sera toujours vérifier pour les erreurs dans les données de la session, et de se lier automatiquement à la vue si elles sont disponibles. Donc, il est important de noter qu'un $errors variable sera toujours disponible dans toutes vos vues, sur chaque demande, ce qui vous permet de supposer l' $erreurs variable est toujours défini et peut être utilisé en toute sécurité.L' $errors variable sera une instance de MessageBag.

Parce que Laravel est Redirect... withErrors() méthode de cela, vous n'avez pas besoin d'ajouter les erreurs de la Session de nouveau à la main.Au lieu de vérifier if (Session::has('global')), il suffit de faire ceci:

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

Cela devrait fonctionner même si il est dans l' layout et pas dans le réel, car la liaison qui s'applique errors à l'intérieur du modèle s'applique aussi à eux de l'extérieur.

Si il n'y a pas d'erreurs, Laravel vais juste passer à bloc.Si il y a des erreurs, il sera automatiquement liée à la $errors variable et sera rendu comme prévu.

Autres conseils

J'ai été à l'origine de l'écriture d'une réponse que recommandé Vue Compositeurs, mais alors je re-lisez la question et je crois que ce que vous devez faire est de l'abstraction de la forme de la validation d'un formulaire de classe:

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

L'idée de base que j'ai reçu de votre question, c'est que vous voulez que votre contrôleur à ressembler à quelque chose comme ceci:

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

    // Non-error logic branch
}

Votre formulaire de classe va contenir une référence à l'objet validateur.Tous les isValid méthode est essentiellement appel passes() sur le validateur, et tous les error méthode renvoie simplement les résultats de l'appel errors() sur le validateur.

Honnêtement, je n'ai aucune idée de pourquoi vous êtes réellement en combinant tous les messages d'erreur en une seule variable, je suppose que c'est parce que vous voulez tous les affiché au même endroit.Si c'est le cas et c'est la façon dont vous voulez que les erreurs de la fonction, alors vous pouvez le construire en à votre formulaire errors la méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top