【问题标题】:How to pass extra data after validation?验证后如何传递额外数据?
【发布时间】:2019-04-15 14:17:02
【问题描述】:

验证后我想传递一些额外的数据来查看。但是,我不能发送它。

我的控制器就像,

public function test()
{
    $validator = Validator::make(
        request()->all(), 
        [ 'ziptest' => 'regex:/^([0-9]{3}-[0-9]{4})$/']
    );

    $errors = $validator->errors();

    if($errors->any()) {
        return back()
            ->withErrors($errors)
            ->withTitle('Data From Controller')
            ->withInput();
    }

    return 'success';
}

在我的刀片中,我想检查标题是否通过。所以在我的刀片视图中我有

@if($errors->any())
    @foreach($errors->all() as $error)
        <li>{{ $error }}</li>
    @endforeach
@endif

@if(isset($title))
    <p>{{ $title }}</p>
@endif

但是,错误部分可以正常显示。但不是标题。为什么它不起作用?

我也试过用这种方式发送标题。

return back()->withErrors($errors)
    ->with('title','Data From Controller')
    ->withInput();

它也不起作用。

我在 SO 中进行了搜索,发现了几个关于将数据从控制器传递到视图的类似问题。不过,我的情况有点不同。

【问题讨论】:

    标签: laravel laravel-5.7


    【解决方案1】:

    在您的示例中,您正在重定向回之前的位置。当您使用 with* 进行重定向时,信息会闪现到会话中,而不是像返回视图那样直接提供给视图。

    要使其与您的示例一起使用,您必须检查 session('title') 以从重定向中获取闪现的标题。

    【讨论】:

    • 谢谢。我明白了。再澄清一点。返回 view()->with() 并返回 back()->with(); with() 两者的工作方式不同。我说的对吗?
    • 完全正确 - view 通过给定数据构建 Blade 视图文件,redirect 生成 HTTP 重定向并将给定数据放入会话中。 Laravel 会自动使用会话中的错误重新填充视图(请参阅应用程序中的 ShareErrorsFromSession 中间件)。
    • 作为旁注,withErrors 确实在重定向路由中创建了一个$errors 变量,但这是因为中间件ShareErrorsFromSession 而发生的,所以这是一种特殊情况。您大概可以制作自己的中间件来模拟其他变量的类似行为
    【解决方案2】:

    您的第二种方法几乎是正确的。

    return back()->withErrors($errors)
        ->with([
            'title' => 'Data From Controller'
        ])
        ->withInput();
    

    注意数组符号

    【讨论】:

    • 抱歉,问题依旧。刀片页面中没有“标题”。
    【解决方案3】:

    这里使用array_merge方法

        $errors = $validator->errors();
    
        if($errors->any()) {
          $newErrors = array_merge($errors->toArray(),['title' => 'Data From Controller']);  
          return back()
                ->withErrors($newErrors)
                ->withInput();
        }
    

    【讨论】:

    • 它正在返回数据,但作为一个错误。是否可以将数据作为普通变量发送?
    【解决方案4】:

    您是否在验证钩子后尝试过,但它会返回错误包中的数据

     $validator->after(function ($validator) {
            $validator->errors()->add('someField', 'Somedata');
     });
    

    我想知道你从哪里调用视图,因为我看到你的 test() 方法只做验证部分,你认为你可以用它传递数据,但通过验证我认为你可以发送错误包要查看的数据。

    【讨论】:

    • 为什么要返回error bag里面的数据?这不是错误。我不是从这里调用视图。只有我在做验证。
    • 看看你有很多肮脏的选项,比如会话和 cookie,否则会通过视图传递数据,无论你从哪里调用视图。
    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多