Как передавать значения между шаблонами в Laravel?[закрыто]
Вопрос
Я использую 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
метод.