【问题标题】:Accessing errors in a controller from a redirect Laravel从重定向 Laravel 访问控制器中的错误
【发布时间】:2014-06-01 23:45:06
【问题描述】:

如您所料,当验证失败时,我创建了一个重定向。

return Redirect::to('search')->withErrors($v->messages())

我可以毫无问题地在视图中访问它,但我想做一些不同的事情。我有一个 ErrorPartial.blade.php,我想将它传递给我的搜索视图。

return View::make('search.searchForm')
        ->with('title', 'Search Page')
        ->with('components', Subject::select('Component')->distinct()->get())
        ->with('measurementRow',$measurementRow)
        ->with('races', Race::parseRaceTable())
        ->with('errorPartial', View::make('errorPartial')
                ->with('errors',$v->messages())
                ->render())
        ;

问题是我无法在这个控制器函数中访问 $v。我可以通过某种方式访问​​将要传递给视图的错误吗?我试过这个:

return Redirect::to('search')->withErrors($v->messages())
            ->with('v', $v);

但我收到此错误。

Serialization of 'Closure' is not allowed

我可以在我的搜索视图中创建部分视图,但我想知道他们是否可以这样做。如果有人知道哪个更有效或 GPP,那么我也不介意知道这一点。

谢谢

【问题讨论】:

  • 包括视图中的部分内容。当您通过 errors 时,它们也将可用于部分。
  • 这是执行此操作的有效方法吗/您是否知道是否可以以其他方式执行此操作,访问控制器中的错误并将视图传递给部分视图。你知道如果只是在视图中创建部分是 GPP(良好的编程实践)
  • 只要视图或部分不知道数据来自哪里,就像在其中调用模型一样,您应该可以使用 GPP。请看我之前的问题,stackoverflow.com/questions/16092045/…
  • 您的评论将我引向laravel.com/docs/responses,这将我引向laravel.com/docs/session。在我的控制器中,我可以这样做:$errors = Session::get('errors'),允许我将它传递给局部视图。 TY

标签: validation view controller laravel-4


【解决方案1】:

回答问题以将其作为开放式问题结束。

Laravel 将错误存储在 Session 中,可以这样访问:

$errors = Session::get('errors');

【讨论】:

  • 不完全。如果没有错误,你不能调用 $errors->any(),你会得到Call to a member function any() on null 在刀片中这将正常工作。
【解决方案2】:

Laravel 将错误存储在 Session 中。

刀片中所有可用的功能都来自 ViewErrorBag 类。

use Illuminate\Support\ViewErrorBag;
...
$errors = session()->get('errors', app(ViewErrorBag::class));

这种方法是首选,因为如果会话中没有错误,它会返回空错误包。这意味着您可以在此对象上调用$errors->any() 而不会出现错误提示

在 null 上调用成员函数 any()

您始终可以按照此建议在源代码中找到实现

$errors 变量由Illuminate\View\Middleware\ShareErrorsFromSession 中间件绑定到视图,该中间件由web 中间件组提供。应用此中间件时,$errors 变量将始终在您的视图中可用,让您可以方便地假设 $errors 变量始终已定义并可安全使用。

Documentation

【讨论】:

  • 很好的答案,因为它是“Laravel 方式”。这应该是公认的答案。
【解决方案3】:

这是另一种选择。从默认消息包中获取错误键。

use Illuminate\Support\Facades\Session;

public function tranfers(Request $request) {
    ...
    // test the error exists
    $has_tranfer_error = (Session::get('errors') && Session::get('errors')->getBag('default')->has('insufficient_funds'));
    ...
}

public function make_transfer(Request $request) {
    ...
    // Add the error
    return back()->withErrors(['insufficient_funds' => 'The balance is too low to make a transfer'])->withInput();
}

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 2018-04-03
    • 2013-11-30
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多