
在 Laravel 中使用自定义 Blade 组件(如 )时,若未正确定义组件接收的属性,会导致“Undefined variable $post”错误;根本原因是组件内部未声明 @props(['post']),无法从父模板安全解构传入的数据。
在 laravel 中使用自定义 blade 组件(如 `
Blade 组件(如 post-card.blade.php)并非普通视图模板,而是独立作用域的可复用单元。即使父模板通过 <x-post-card :post="$post"></x-post-card> 正确传入了 $post 变量,组件内部仍需显式声明该属性才能访问——否则 PHP 会将其视为未定义变量并抛出错误。
✅ 正确做法:在 resources/views/components/post-card.blade.php 文件顶部第一行添加属性声明:
@props(['post'])
<div class="mt-4">
<h1 class="text-3xl font-bold">{{ $post->title }}</h1>
<p class="text-gray-600 mt-2">{{ Str::limit($post->excerpt, 120) }}</p>
</div>⚠️ 常见误区与注意事项:
- ❌ 不要写
@foreach($posts as $post)—— 这是逻辑混淆:post-card是单条记录渲染组件,不应自行遍历集合; - ❌ 不要在组件内直接使用未声明的变量(如
$post),即使父级有同名变量,Blade 组件默认不继承父作用域; - ✅ 若需支持可选属性或默认值,可用
@props(['post' => null])并在组件内做空值判断:@if($post) ... @endif; - ✅ 强烈建议启用 Laravel 的 Blade 组件类型提示(PHP 8+),配合
#[Prop]属性提升 IDE 支持与运行时健壮性。
最后,请确认组件注册路径正确(默认 App\View\Components\PostCard 对应 post-card.blade.php),且命名规范统一(kebab-case 调用 ↔ PascalCase 类名)。修复后,<x-post-card :post="$post"></x-post-card> 将稳定渲染每一条文章卡片。


















