在 Laravel 中存储错误消息的最佳方式(会话或变量)

ofm*_*oon 0 php variables session notifications laravel

我试图找出存储错误消息的最佳方法(例如由于参数错误)。

假设我在控制器中声明接受的参数,但如果给出了任何其他参数,我想显示一个页面,仅显示错误消息“给出了错误的参数”。
非常简单的代码示例:

if ($param == 'example') {
  // some code
} else {
  // accepting no other parameter and should return a page with an error message
  // session? variable?
}
return view('index/example');
Run Code Online (Sandbox Code Playgroud)
  1. 我可以使用一些会话,例如:

    • 正常会话:session()->put(...)
      问题:如果我不手动删除数据,数据就会保留

    • 向会话闪烁一条消息:session()->flash(...)
      问题:这是为了下一个请求,所以当我更正错误的参数时,我必须重新加载两次才能加载正确的页面

    • 当前请求的会话:session()->now(...);
      问题:??

  2. 我还可以使用普通变量:

    • $error = 'message;
      return view('index', compact('error'));
      问题:如果不手动删除,带有错误消息的变量将被保留

我知道会话闪现消息是为此类消息创建的,但我真的不想使用它,因为我上面已经简短地解释了这个问题。

我想了解每种方法的(缺点)优点,以及哪种方法最好,或者是否有推荐的方法实际上效果很好。

Pav*_*int 5

我推荐我在项目中使用的这段代码:

/*
 * Add an error to Laravel session $errors
 * @author Pavel Lint
 * @param string $key
 * @param string $error_msg
 */
function add_error($error_msg, $key = 'default') {
    $errors = Session::get('errors', new ViewErrorBag);

    if (! $errors instanceof ViewErrorBag) {
        $errors = new ViewErrorBag;
    }

    $bag = $errors->getBags()['default'] ?? new MessageBag;
    $bag->add($key, $error_msg);

    Session::flash(
        'errors', $errors->put('default', $bag)
    );
}
Run Code Online (Sandbox Code Playgroud)

这使您可以将错误存储在 Laravel 本身所在的位置。您将受益于$errors所有刀片模板中自动提供的变量。然后在你的刀片中的某个地方,这段标准代码将显示错误:

@if ($errors->any())
    <div class="alert alert-danger">
        There were some errors with your request.
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
Run Code Online (Sandbox Code Playgroud)

  • 这是使用“正常”会话,它通过 Session::flash 将数据刷新到其中。通常,错误会闪烁,以便它们在下一页请求时消失,您不希望错误在每个页面上跟随用户。此函数的优点是可以重复使用与 Laravel 使用的相同存储,因此您可以使用单个代码片段来显示框架错误和您自己的错误。 (2认同)