Как передавать значения между шаблонами в Laravel?[закрыто]

StackOverflow https://stackoverflow.com//questions/25007377

  •  20-12-2019
  •  | 
  •  

Вопрос

Я использую Laravel Framework 4.1.30.

Как передать данные из одного шаблона в другой, минуя маршрут или контроллер?

Особенности:Я получил шаблон колонки «Основной», который расширен шаблоном колонки «Вход».Моя цель — поместить все ошибки, которые появляются в шаблоне «Вход», и отобразить их в нижнем колонтитуле шаблона «Главный».

Мои коды для основного шаблона внутри тега «body» следующие (обратите внимание, что между ними существуют некоторые коды для форматирования моего представления):

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

Шаблон блейда, вызывающий Main, кодируется следующим образом:

@extends('layout.main')

@section('content')

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

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

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

@stop

Насколько я понимаю (довольно новый для Laravel), контент должен быть прочитан первым, прежде чем глобальное отображение сеанса.

Я надеялся, что простой переменной, передаваемой между шаблонами, будет достаточно (если она существует), чтобы решить проблему.Я хочу передать значение ошибки из содержимого обратно в основной шаблон в разделе нижнего колонтитула, не возвращаясь к контроллеру.

Я знаю, что есть обходные пути, например, вместо того, чтобы ждать, пока контроллер выведет ошибки в шаблон, я мог бы передать ошибки непосредственно в глобальную переменную через сеанс (или в макет) из контроллера.В настоящее время я реализовал следующий рабочий код, но мне просто интересно, что, если данные уже были переданы в шаблон.

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

Почему я это делаю, так это то, что изначально мой код на контроллере такой...

        if ($validator->fails()) {

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

Теперь оно кажется таким большим.Я полагаю, что если я смогу разгрузить контроллер с помощью цикла, моя программа будет более эффективной.

Это было полезно?

Решение

Из Документация Ларавел (курсив их):

Однако обратите внимание, что нам не нужно явно привязывать сообщения об ошибках к представлению в нашем маршруте GET.Это связано с тем, что Laravel всегда будет проверять наличие ошибок в данных сеанса и автоматически привязывать их к представлению, если они доступны. Итак, важно отметить, что $errors переменная всегда будет доступна во всех ваших представлениях, при каждом запросе, что позволяет вам легко предположить, что переменная $errors всегда определена и ее можно безопасно использовать.А $errors переменная будет экземпляром MessageBag.

Потому что Ларавел Redirect... withErrors() делает это, вам не нужно снова добавлять ошибки в сеанс вручную.Вместо проверки на if (Session::has('global')), просто сделайте это:

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

Это должно сработать Несмотря на то это в layout а не в реальном представлении, поскольку применимая привязка errors внутри шаблона они также применяются за его пределами.

Если ошибок нет, Laravel просто пропустит этот блок.Если есть ошибки, они будут автоматически привязаны к $errors переменная и будет отображаться как ожидалось.

Другие советы

Изначально я писал ответ, который рекомендовал Посмотреть композиторов, но затем я перечитал вопрос и считаю, что вам нужно абстрагировать проверку формы до класса «формы»:

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

Основная идея, которую я понял из вашего вопроса, заключается в том, что вы хотите, чтобы ваш контроллер выглядел примерно так:

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

    // Non-error logic branch
}

Ваш класс формы будет в основном содержать ссылку на объект валидатора.Все isValid метод должен делать, это в основном вызывать passes() на валидаторе и все error метод просто вернет результаты вызова errors() на валидаторе.

Честно говоря, я понятия не имею, почему вы на самом деле объединяете все сообщения об ошибках в одну переменную. Я предполагаю, что это потому, что вы хотите, чтобы они все отображались в одном месте.Если это так и вы хотите, чтобы ошибки функционировали именно так, вы можете встроить это в свою форму. errors метод.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top