0

0

Laravel Blade组件如何实现代码复用? (class与匿名组件)

尼克

尼克

发布时间:2026-01-25 16:30:10

|

329人浏览过

|

来源于php中文网

原创

Blade class 组件需定义继承 Illuminate\View\Component 的 PHP 类并实现 render() 方法,类须置于 app/View/Components/ 下且通过 artisan 命令生成;匿名组件则为 resources/views/components/ 下的纯 Blade 文件,通过 @props 声明属性,无需 PHP 类。

laravel blade组件如何实现代码复用? (class与匿名组件)

Blade class 组件:必须定义完整 PHP 类

Blade class 组件不是直接写在视图里就能用的,它要求你先创建一个继承 Illuminate\View\Component 的 PHP 类,并在其中定义 render() 方法。Laravel 不会自动扫描视图目录下的 PHP 文件——类必须放在 app/View/Components/ 下,且需通过 php artisan make:component Alert 命令生成(否则命名空间、目录结构或自动发现容易出错)。

常见错误是把 class 组件当成普通模板直接 @include,结果报错 Class "App\View\Components\Alert" not found。正确做法是:运行命令生成类 → 在 render() 中返回 view('components.alert') → 然后在 Blade 中用 调用。

参数传递靠构造函数和 public 属性,例如:

class Alert extends Component
{
    public string $type;
    public string $message;
public function __construct(string $type = 'info', string $message = '')
{
    $this->type = $type;
    $this->message = $message;
}

public function render()
{
    return view('components.alert');
}

}

注意:构造函数参数不能是可选类型(如 ?string),否则 Laravel 无法解析依赖;$message 默认空字符串是安全的,但 null 会导致绑定失败。

Blade 匿名组件:零 PHP 类,直接复用视图文件

匿名组件本质就是一个带 @props 声明的 Blade 文件,无需 PHP 类、无需注册、不走服务容器。它适合轻量、无逻辑、纯展示型复用,比如按钮、卡片外壳、表单字段包装器。

使用前提是:文件必须放在 resources/views/components/ 目录下(如 resources/views/components/card.blade.php),且文件名决定标签名(card.blade.php)。路径层级不影响调用,但不能嵌套子目录(components/ui/card.blade.php 不会被识别)。

Lobe
Lobe

微软旗下的一个训练器学习模型的平台

下载

@props 必须写在文件顶部,且只能出现一次;它接收传入的属性并自动转为变量:

@props(['title' => '', 'border' => true])

merge(['class' => 'p-4 rounded']) }}> @if($title)

{{ $title }}

@endif {{ $slot }}

调用时:内容区。注意:$attributes 是默认注入的,用于透传未声明的 HTML 属性(如 iddata-* );$slot 是组件标签内的内容。

class vs 匿名组件:关键差异在哪

二者根本区别不在语法,而在执行时机和能力边界:

  • class 组件在渲染前经过 PHP 实例化,支持依赖注入(如 RequestAuth)、数据库查询、复杂条件判断;匿名组件只做变量替换,无法调用服务或执行业务逻辑
  • class 组件的属性校验靠 PHP 类型提示 + 构造函数,报错明确;匿名组件的 @props 没有类型检查,传错参数(如传数组给期望字符串的 $title)可能只在运行时报 Notice 或渲染异常
  • class 组件可通过 public $foo 暴露属性供模板访问,也可定义方法(如 public function cssClasses());匿名组件只能靠 @props 和内联逻辑
  • 性能上,匿名组件略快(少一次类加载与实例化),但差异微乎其微;可维护性上,逻辑复杂时 class 组件更易测试和复用

容易被忽略的 slot 与 attributes 处理细节

无论是 class 还是匿名组件,$slot$attributes 都不是“自动可用”的魔法变量——它们必须显式出现在模板中,且位置决定最终 HTML 结构。漏写 {{ $slot }} 就等于丢掉所有子内容;漏写 {{ $attributes }} 就等于丢掉外部传入的 classid 等属性。

常见陷阱:

  • $attributes->merge([...]) 会覆盖同名属性(如外部传了 class="btn",而 merge(['class' => 'btn-primary']) 会完全替换,不是追加);要用 class="{{ $attributes->get('class', '') }} btn-primary" 手动拼接
  • $slotIlluminate\Support\HtmlString 实例,不能直接用 isset($slot) 判断是否有内容,得用 !$slot->isEmpty()strlen($slot) > 0
  • 多 slot 场景(如 ...)只在 class 组件中稳定支持;匿名组件不支持具名 slot,强行用会静默失效

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2890

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1731

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1564

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1099

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1546

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1277

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1649

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1309

2023.11.13

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 10.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号