
在 Laravel 中通过 AJAX 加载模态框表单时,因 @error 指令依赖 $errors 共享变量(由 ValidateRequest 或 withErrors() 自动注入),而直接访问 /kategori/create 路由返回视图时未触发验证逻辑,导致 $errors 未定义,引发 500 错误。
在 laravel 中通过 ajax 加载模态框表单时,因 `@error` 指令依赖 `$errors` 共享变量(由 `validaterequest` 或 `witherrors()` 自动注入),而直接访问 `/kategori/create` 路由返回视图时未触发验证逻辑,导致 `$errors` 未定义,引发 500 错误。
该问题的根本原因在于:Laravel 的 $errors 变量仅在重定向响应(如 redirect()->back()->withErrors(...))或显式传递错误数据时才会自动绑定到视图中。而你的 create() 方法仅执行 return view('kategori.createKategori'),未经过任何验证流程,因此 $errors 为 null,调用 @error('nama_kategori') 时即触发「Undefined variable $errors」异常。
✅ 正确修复方式(推荐)
不要仅用 @if ($errors->any()) 包裹 @error —— 这只是掩盖问题,且语法有误(缺少 @ 符号)。正确做法是确保 $errors 始终可用,推荐两种专业方案:
方案一:在 create() 方法中显式传递空的 $errors(最简洁可靠)
// app/Http/Controllers/KategoriController.php
public function create()
{
// 强制注入一个空的 ViewErrorBag,确保 $errors 始终存在
return view('kategori.createKategori', [
'errors' => new \Illuminate\Support\ViewErrorBag()
]);
}
这样无论是否发生验证,视图中的 $errors 都是有效实例,@error 指令可安全执行。
方案二:使用 @isset + @error 组合(无需修改控制器)
{{-- createKategori.blade.php --}}
<x-modal modalid="modalCreateKategori" modaltitle="Tambah Kategori"><form method="post" action="%7B%7B%20route('kategori.store')%20%7D%7D" class="formtambah">
@csrf
<div class="grid grid-rows-2">
<div>
<x-label>Nama Kategori</x-label><x-input type="text" name="nama_kategori" id="nama_kategori"></x-input>
@isset($errors)
@error('nama_kategori')
<small class="text-red-500 text-sm mt-1">{{ $message }}</small>
@enderror
@endisset
</div>
<div class="justify-end items-center">
<x-button type="submit">Simpan</x-button>
</div>
</div>
</form>
</x-modal>
⚠️ 注意:原答案中 @if ($errors->any()) @error(...) @enderror endif 写法存在严重语法错误——endif 应为 @endif,且 @error 必须在 $errors 存在的前提下才能调用;若 $errors 未定义,$errors->any() 本身就会报错。因此 @isset($errors) 是更安全的前置判断。
? 补充验证建议
- 确保 createKategori.blade.php 中已包含 CSRF meta 标签(通常在 app.blade.php 布局中):
<meta name="csrf-token" content="{{ csrf_token() }}"> - AJAX 提交成功后,建议重置表单并清空错误提示,避免残留:
success: function(response) { Swal.fire({ /* ... */ }); $('.formtambah')[0].reset(); // 重置表单 $('.text-red-500').remove(); // 清除旧错误提示(如有) $('.btn-close').click(); dataKategori(); }
✅ 总结
| 问题根源 | create() 视图未注入 $errors,@error 指令执行失败 |
|---|---|
| 推荐解法 | 在 create() 方法中传入空 ViewErrorBag 实例,保障 $errors 始终可用 |
| 替代方案 | 使用 @isset($errors) 安全包裹 @error,避免运行时异常 |
| 关键提醒 | 不要依赖 @if ($errors->any()) 做前置判断——它无法防止 $errors 未定义的致命错误 |
遵循上述任一方案,即可彻底解决模态框加载时报 “Undefined variable $errors” 的问题,同时保持代码健壮性与 Laravel 最佳实践一致。











