【问题标题】:Laravel request validation doesn't show error messagesLaravel 请求验证不显示错误消息
【发布时间】:2020-04-28 20:04:32
【问题描述】:

使用组中间件后,我无法访问错误消息。错误包返回空。

之前没问题。

我研究过,有用户通过修改http/kernel.php解决了这个问题

\Illuminate\Session\Middleware\StartSession::class, $middlewareGroups$middleware

但是,它对我不起作用。

另外 $validated = $request->validated(); 函数不会返回验证错误。在我的 CreditcardRequest 类中,我有属性、消息、规则函数。如果验证失败,则需要显示这些消息。 以前当验证();方法在控制器上运行,如果表单为空,它会显示消息。在中间件分组之前,我有 20 个页面都在工作。

信用卡刀片

<div class="messages">
    @if ($errors->any())
        <div class="row  mt-3">
            <div class="col-md-12">
                <div class="alert alert-warning alert-dismissable" role="alert">
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h3 class="alert-heading font-size-h4 font-w400">Error!</h3>
                    @foreach ($errors->all() as $error)
                        <p class="mb-0">{{ $error }}</p>
                    @endforeach
                </div>
            </div>
        </div>
    @endif
</div>

信用卡申请

public function attributes()
{
    return [
        'cc_name' => 'CC Owner',
        ..
    ];
}

public function messages()
{
    return [
        'required' => 'Required: :attribute',
        ...
    ];
}

public function rules()
{
    return [
        'cc_name' => 'required|max:128',
    ];
}

控制器

public function doPaySection(CreditcardRequest $request)
  {

      $validated = $request->validated();
      $cc = TRUE;
      if ($cc):
          return redirect('/pay_success')->with('success', 'success');
      else:
          return redirect('/pay_error')->with('error', 'error');
      endif;
  }

web.php

Route::group(['middleware' => ['client.role:guest']], function () {
    Route::get('/login', 'HomepageController@showLogin')->name('login');
    Route::post('/login', 'HomepageController@doLogin');
    Route::post('/register', 'HomepageController@doRegister');
    Route::get('/register', 'HomepageController@showRegister')->name('register');
});

login.blade

@if ($errors->any())
    <div class="row  mt-3">
        <div class="col-md-12">
            <div class="alert alert-warning alert-dismissable" role="alert">
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
                <h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
                @foreach ($errors->all() as $error)
                    <p class="mb-0">{{ $error }}</p>
                @endforeach
            </div>
        </div>
    </div>
@endif

控制器

public function doLogin(Request $request)
{
    if (auth()->guard('client')->attempt(['email' => request('email'), 'password' => request('password')])) {
        return redirect()->intended('/');
    } else {
        return redirect()->back()->with('error', 'error');
    }
}

【问题讨论】:

  • 你没有使用 Laravel 自带的 auth 有什么原因吗?您现在拥有的代码不会向error bag 添加“错误”。
  • 它不仅是身份验证错误,我还有很多表单,我正在使用 $request->validated();方法。当输入为空时,它应该返回一个错误。我为你添加了另一个控制器。

标签: laravel laravel-6


【解决方案1】:

您可以尝试在您的请求中使用此标头吗?特别是如果你是从邮递员那里打的。

Accept:application/json

在使用它之前,我会在收到无效请求时获取 csrf 令牌。

【讨论】:

    【解决方案2】:

    您现在拥有的代码不会向$errors MessageBag 添加消息,它只会向会话添加一个名为错误的值。

    如果你想在消息包中添加错误,你可以简单地抛出一个 ValidationException 并使用该消息重定向 back

    public function doLogin(Request $request)
    {
        if (auth()->guard('client')->attempt($request->only('email', 'password'))) {
            return redirect()->intended('/');
        }
    
        throw ValidationException::withMessages([
            'error' => 'The error message',
        ]);
    }
    

    别忘了导入ValidationException

    use Illuminate\Validation\ValidationException;
    

    【讨论】:

    • 先生,谢谢。它适用于登录页面。但我仍然无法得到验证错误。在创建中间件之前,我可以使用 request->validated() 显示错误消息;但现在错误返回空。顺便说一句,我编辑了问题。
    • @tyasird validated() 方法不是用于显示错误,而是从您已验证的请求中获取属性(包含在您的表单请求类中)。当您键入提示表单请求类作为控制器方法的属性时,验证将自动发生,如果验证失败,那么它将不会在您的控制器方法中运行单行,并且会简单地重定向回带有错误的上一页.您希望看到什么错误??
    • 在我的 RequestClass 中,我有属性、消息、规则函数。如果验证失败,则需要显示此消息。以前当验证();方法在控制器上运行,如果表单为空,它会显示消息。在中间件分组之前,我有 20 个页面都在工作
    • @tyasird 具体您希望看到什么错误消息?
    • 我希望看到表单输入所需的错误。正如您在我的 CreditcardRequest 类中看到的那样,表单输入 cc_name 不应为空。在 CreditcardRequest 类中有我希望验证的错误消息和必需的输入名称。当输入为空时应该返回错误,但现在它不返回任何错误。验证工作没有问题,但我在刀片上看不到验证错误。
    【解决方案3】:

    您将能够从下方进入session('error')

    return redirect()->back()->with('errors', 'error');
    

    所以你的代码会是这样的

    @if (session('errors'))
        <div class="row  mt-3">
            <div class="col-md-12">
                <div class="alert alert-warning alert-dismissable" role="alert">
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
                    @foreach (session('errors') as $error)
                        <p class="mb-0">{{ $error }}</p>
                    @endforeach
                </div>
            </div>
        </div>
    @endif
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2017-01-06
      • 2018-11-05
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      相关资源
      最近更新 更多