Pregunta

Estoy usando Laravel Framework 4.1.30.

¿Cómo se pasan datos de una plantilla a otra sin pasar por la ruta o el controlador?

Detalles específicos:Obtuve una plantilla de hoja "Principal" que se amplía con una plantilla de hoja "Inicio de sesión".Mi objetivo es colocar cualquier error que aparezca en la plantilla "Iniciar sesión" y mostrarlo en una sección de pie de página de la plantilla "Principal".

Mis códigos para la plantilla principal dentro de la etiqueta "cuerpo" son los siguientes (tenga en cuenta que existen algunos códigos intermedios para formatear mi 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

La plantilla de hoja que llama a Main está codificada así:

@extends('layout.main')

@section('content')

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

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

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

@stop

Según tengo entendido (bastante nuevo en Laravel), el contenido debe leerse primero antes de que la sesión se muestre global.

Esperaba que una simple variable que pasara entre plantillas fuera suficiente (si existe) para resolver el problema.Deseo pasar el valor de error del contenido a la plantilla principal en la parte de la sección de pie de página sin volver al controlador.

Soy consciente de que existen soluciones alternativas, como por ejemplo, en lugar de esperar a que el controlador envíe los errores a la plantilla, podría pasar los errores directamente a la variable global a través de la sesión (o al diseño) desde el Controlador.Actualmente, el siguiente código de trabajo es lo que he implementado, pero me pregunto qué pasa si los datos ya se pasaron a la plantilla.

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

La razón por la que lo hago es que originalmente mi código en el controlador es como...

        if ($validator->fails()) {

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

Ahora parece tan grande.Supongo que si puedo aliviar el controlador con un bucle, mi programa sería más eficiente.

¿Fue útil?

Solución

Desde el documentación de laravel (énfasis en el suyo):

Sin embargo, observe que no tenemos que vincular explícitamente los mensajes de error a la vista en nuestra ruta GET.Esto se debe a que Laravel siempre buscará errores en los datos de la sesión y los vinculará automáticamente a la vista si están disponibles. Entonces, es importante señalar que un $errors La variable siempre estará disponible en todas sus vistas, en cada solicitud., lo que le permite asumir cómodamente que la variable $errors siempre está definida y se puede utilizar de forma segura.El $errors La variable será una instancia de MessageBag.

porque laravel Redirect... withErrors() El método hace esto, no es necesario agregar los errores a la sesión nuevamente manualmente.En lugar de comprobar si if (Session::has('global')), solo haz esto:

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

Esto debería funcionar a pesar de eso esta en el layout y no en la vista real, porque la vinculación que se aplica errors dentro de la plantilla también los aplica fuera de ella.

Si no hay errores, Laravel simplemente omitirá ese bloque.Si hay errores, se habrán vinculado automáticamente al $errors variable y se representará como se esperaba.

Otros consejos

Originalmente estaba escribiendo una respuesta que recomendaba Ver compositores, pero luego volví a leer la pregunta y creo que lo que hay que hacer es abstraer la validación del formulario a una clase de 'formulario':

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

La idea básica que saqué de tu pregunta es que quieres que tu controlador se vea así:

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

    // Non-error logic branch
}

Su clase de formulario básicamente contendrá una referencia al objeto validador.Todos isValid El método que debe hacer es básicamente llamar. passes() en el validador, y todos los error El método simplemente devolverá los resultados de la llamada. errors() en el validador.

Sinceramente, no tengo idea de por qué estás combinando todos los mensajes de error en una sola variable. Supongo que es porque quieres que se muestren todos en el mismo lugar.Si ese es el caso y así es como desea que funcionen los errores, entonces puede incorporarlo en el formulario errors método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top