如何在Laravel中的模板之间传递值?

时间:2014-07-29 02:32:00

标签: php laravel laravel-4

我使用的是Laravel Framework 4.1.30。

如何在不通过路径或控制器的情况下将数据从一个模板传递到另一个模板?

细节:我得到了一个" Main"通过"登录"扩展的刀片模板刀片模板。我的目标是在"登录"中出现任何错误。模板并将其显示在" Main"的页脚部分。模板。

我在" 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相当新),在会话显示全局之前,首先要读取内容。

我希望,在模板之间传递的简单变量就足够了(如果存在)来解决问题。我希望将内容中的错误值传递回页脚部分的主模板而不返回控制器。

我知道有一些解决办法,比如等待控制器将错误输出到模板,我可以通过Controller的会话(或布局)将错误直接传递给全局变量。目前,我已经实现了以下工作代码,但我只想知道数据是否已经传递给模板。

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();

现在它看起来很大。我想如果我可以通过循环缓解控制器,我的程序会更有效率。

2 个答案:

答案 0 :(得分:3)

Laravel documentation(强调他们的):

  

但是,请注意,我们不必将错误消息显式绑定到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变量,并将按预期呈现。

答案 1 :(得分:2)

我最初写的是一个推荐View Composers的答案,但后来我重新阅读了这个问题,我相信你需要做的是将表单验证抽象为一个&#39;形式&#39;类:

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
}

您的表单类基本上包含对validator对象的引用。所有isValid方法应该在验证器上基本上调用passes(),并且所有error方法都只返回在验证器上调用errors()的结果。

老实说,我不知道为什么你实际上将所有的错误信息组合成一个变量,我认为它是因为你希望它们都显示在同一个地方。如果是这种情况以及您希望错误如何发挥作用,那么您可以将其构建到表单的errors方法中。