我正在使用 Laravel 框架 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();

现在看来已经这么大了。我想如果我可以用循环来减轻控制器的负担,我的程序会更加高效。

有帮助吗?

解决方案

来自 Laravel 文档 (强调他们的):

但是,请注意,我们不必将错误消息显式绑定到 GET 路由中的视图。这是因为 Laravel 将始终检查会话数据中的错误,并自动将它们绑定到视图(如果可用)。 因此,重要的是要注意 $errors 根据每个请求,变量将始终在您的所有视图中可用, ,让您可以方便地假设 $errors 变量始终已定义并且可以安全使用。这 $errors 变量将是一个实例 MessageBag.

因为 Laravel 的 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