You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加@error()指令或@csrf后Lumen出现白屏问题求助

解决Lumen中Blade模板使用@error指令白屏的问题

问题原因

Lumen 作为轻量版框架,默认不支持 Laravel Blade 中的 @error 指令,直接使用会导致模板解析错误,进而出现白屏。

解决方案

方案一:手动通过$errors变量显示错误信息(推荐)

这是Lumen中显示验证错误的标准方式,无需额外扩展:

  1. 修改控制器的验证逻辑
    捕获验证异常,重定向回表单页面并携带错误信息与用户输入:

    use Illuminate\Validation\ValidationException;
    
    public function register(Request $request)
    {
        try {
            $incomingFields = $this->validate($request, [
                'username' => ['required', 'min:3', 'max:30', Rule::unique('users', 'username')],
                'email' => ['required','email', Rule::unique('users', 'email')],
                'password' => ['required', 'min:10', 'confirmed']
            ]);
    
            $incomingFields['password'] = Hash::make('secret');
            Users::create($incomingFields);
    
            return redirect('/')->with('success', '注册成功');
        } catch (ValidationException $e) {
            // 重定向回表单,携带错误信息和之前的输入
            return redirect()->back()->withErrors($e->errors())->withInput();
        }
    }
    
  2. 修改视图模板
    使用$errors变量判断并显示错误,同时回显用户之前的输入:

    <form action="/reg" method="POST" id="registration-form">
      {{ csrf_field() }}
      <div class="form-group">
        <label for="username-register" class=" mb-1"><small>Username</small></label>
        <!-- 回显输入并添加错误样式 -->
        <input 
          name="username" 
          id="username-register" 
          type="text" 
          placeholder="Pick a username" 
          autocomplete="off" 
          class="form-control r {{ $errors->has('username') ? 'is-invalid' : '' }}"
          value="{{ old('username') }}"
        />
        <!-- 判断是否有该字段的错误并显示 -->
        @if($errors->has('username'))
          <p class="m-0 small alert alert-danger shadow-sm">{{ $errors->first('username') }}</p>  
        @endif
      </div>
      <!-- 其他字段可以按照同样的方式处理 -->
    </form>
    

方案二:自定义Blade指令实现@error

如果习惯Laravel的@error语法,可以自定义指令来实现:

  1. 在bootstrap/app.php中添加自定义指令
    确保已取消注释$app->withFacades();,然后添加:

    use Illuminate\Support\Facades\Blade;
    
    // 自定义@error指令
    Blade::directive('error', function ($field) {
        return "<?php if(\$errors->has($field)): \$message = \$errors->first($field); ?>";
    });
    
    // 自定义@enderror指令
    Blade::directive('enderror', function () {
        return "<?php endif; ?>";
    });
    
  2. 确保Session中间件启用
    在bootstrap/app.php的中间件数组中取消注释Session中间件:

    $app->middleware([
        Illuminate\Session\Middleware\StartSession::class,
    ]);
    
  3. 视图中继续使用原有的@error语法
    此时你的原视图代码就可以正常运行了,错误信息会通过$message变量输出。

注意事项

  • 必须启用Session中间件,否则withErrors和old()方法无法正常工作。
  • 验证失败后要重定向回表单页面,不能直接返回字符串,否则错误信息无法传递到视图。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:13:21