【问题标题】:Laravel error is not passed to viewLaravel 错误未传递给视图
【发布时间】:2018-01-08 05:17:54
【问题描述】:

我不明白为什么 laravel Blade 没有捕捉到我的错误验证并且没有将它传递给我的视图。 详细的

  • 我的刀片模板中有错误 sn-p
  • 下面是我的验证,它可以正常工作

我错过了什么?

谢谢

这是我看到的 json 消息,而不是刀片模板中的消息

{ message: "给定的数据无效。", 状态码:500 }

我用这个 sn-p 让用户知道错误

@if(count($errors))
<div class="form-group">
    <div class="alert alert-danger">
        <ul>
            @if($errors->all())
                @foreach($errors->all() as $error)
                    <li>{{$error}}</li>
                @endforeach
            @endif
        </ul>
    </div>
</div> @endif

最后这是我正确工作的验证

        $request->validate([
        'email' => 'required|email|unique:subscribers|max:255',
    ]);

编辑:

这是web.php中的溃败

Route::post('saveemail', 'SaveSubscriberEmailController@saveEmail');

这就是方法

namespace App\Http\Controllers;


use App\subscriber;

use Carbon\Carbon;

use Illuminate\Http\Request;

use Ramsey\Uuid\Uuid;


class SaveSubscriberEmailController extends Controller
{

    public function saveEmail(Request $request)
    {
        $request->validate([
            'email' => 'required|email|unique:subscribers|max:255',
        ]);



        $uuid = Uuid::uuid4();

        $subscriber = new subscriber();
        $subscriber->email = $request->email;
        $subscriber->uuid = $uuid->toString();
        $subscriber->created_at = Carbon::now();
        $subscriber->save();

        flash('Registration conformation email has been sent. Please check your mailbox. Thank you!')->success();
        return redirect()->back();
    }
}

【问题讨论】:

  • 你的路由应该在网络中间件中,否则会话将无法工作,这包括你的 $errors 变量
  • 添加了方法和路由定义。它在 routes/web.php 中,所以它也应该在 web 中间件中
  • web.php 自动在 Web 中间件中。您可以拨打php artisan routes:list查看。您应该会在 Middleware 列中的路由旁边看到 web
  • 在web路由中,用php artisan routes:list确认

标签: laravel error-handling laravel-blade


【解决方案1】:

我以前遇到过这个问题,我能够解决的方法是使用包含中间件 \Illuminate\View\Middleware\ShareErrorsFromSession::class 的中间件组来包装路由。它将会话的错误添加到视图中。

在您的 Kernel.php 类的 protected $middlewareGroups 数组中,它可能类似于:

'web' => [
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    // other middleware
],

然后你可以在哪里声明你的路线:

Route::group(['middleware' => ['web']], function () { 
    Route::post('saveemail', 'SaveSubscriberEmailController@saveEmail'); 
};

【讨论】:

    【解决方案2】:

    请求验证仅发送错误 422 而不是 500 如果您收到此错误,那是因为其他原因,formRequest 错误包不会捕获此错误。

    【讨论】:

      【解决方案3】:

      Route::post('saveemail', 'SaveSubscriberEmailController@saveEmail');

      将此路由放入web中间件。你可以这样做

      Route::middleware(['web'])->group(function () {
      
         Route::post('saveemail', 'SaveSubscriberEmailController@saveEmail');
      
      });
      

      把你的控制器改成这个。

      class SaveSubscriberEmailController extends Controller
      {
      
      public function saveEmail(Request $request)
      {
      
      
      
          $validator = validate($request->all(),[
              'email' => 'required|email|unique:subscribers|max:255',
          ]);
      
         if($validator->fails()){
          return back()->withErrors($validator);
       }
      
      
      
          $uuid = Uuid::uuid4();
      
          $subscriber = new subscriber();
          $subscriber->email = $request->email;
          $subscriber->uuid = $uuid->toString();
          $subscriber->created_at = Carbon::now();
          $subscriber->save();
      
          flash('Registration conformation email has been sent. Please check your mailbox. Thank you!')->success();
          return redirect()->back();
      }
      

      }

      希望对你有帮助

      【讨论】:

      • @Vojta 你必须使用withErrors,看看我的回答我已经更新了。
      • 不幸的是没有变化。您的代码不会像验证失败一样执行,其余的方法没有执行。
      • @Vojta 它与 dingo API 无关。
      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2016-04-14
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多