讲师中心 微信公众号
AI工具推荐 视频效率加速

Yii2的Widget小部件怎么创建_继承Widget类实现复用【教程】

陌丽小哥_4769

陌丽小哥_4769

发布时间:2026-03-23 05:51:11

|

630人浏览过

|

来源于php中文网

原创

Yii2 Widget必须重写init()和run()方法:init()负责初始化(校验、赋值、注册资源),run()必须return字符串;参数需通过public属性声明并用ArrayHelper::merge()合并;必须用Widget::widget()调用而非new;view路径默认为@ app/views/widget-name/;registerJs需加唯一$key防重复。

yii2的widget小部件怎么创建_继承widget类实现复用【教程】

Widget类继承必须重写init()和run()方法

Yii2的Widget不是靠配置驱动,而是靠两个核心钩子:初始化时的init()和渲染时的run()。漏掉任一个,小部件要么不执行逻辑,要么直接报Method not found错误。

常见错误是只写run(),以为返回HTML就够了——但init()里常要处理$this->options、$this->view注入或提前校验参数,跳过它容易导致后续$this->view->registerJs()失败或$this->options未合并默认值。

  • init()里别做输出,只做准备:赋值、校验、注册资源
  • run()必须有return,且返回string(不能echo)
  • 如果需要接收参数,统一通过public $xxx属性声明,并在init()中用ArrayHelper::merge()合并默认值

使用Widget::widget()时传参必须用数组语法

调用自定义Widget不能像普通PHP类那样new MyWidget(['title' => 'xxx']),必须走Yii的工厂方式:MyWidget::widget(['title' => 'xxx'])。否则$this->getView()为空、$this->id不生成、事件绑定失效。

这个限制源于Yii2 Widget生命周期依赖Widget::begin()/Widget::end()或Widget::widget()触发的createObject()流程。手动new会绕过整个上下文初始化。

  • 所有参数都进数组,包括'class'以外的键,如'title'、'items'、'options'
  • 避免在数组里传匿名函数——序列化失败,会导致Serialization of Closure is not allowed
  • 若需动态内容,改用View::renderFile()配合use传变量,而非把闭包塞进widget参数

复用Widget时要注意view路径和命名空间冲突

Widget内部调用$this->render('index')时,默认找@app/views/widget-name/index.php,而不是当前Controller的view目录。很多人误以为它会自动继承调用处的view上下文,结果报View file not found。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载

更隐蔽的问题是:多个Widget同名(比如都叫AlertWidget)但分散在不同模块,若没严格隔离命名空间或别名,use错一个就会加载到旧版本,样式/逻辑静默失效。

  • 在Widget类顶部明确写use yii\base\Widget;,别依赖自动导入
  • view文件路径用__DIR__ . '/views/index.php'硬编码更可控,尤其跨模块复用时
  • 发布到公共组件库前,把namespace设为带vendor前缀的唯一值,例如mycompany\widgets\AlertWidget

性能陷阱:Widget内频繁调用registerJs/registerCss会重复插入

同一个页面多次使用同一Widget(比如列表页每行一个ActionButtonWidget),如果每个实例都在init()里调用$this->view->registerJs("xxx"),JS代码会被插入N次,轻则浪费带宽,重则触发重复绑定事件(点击一次执行N次)。

根本原因是registerJs默认无key去重,它只按内容字符串简单判断是否已注册——而动态生成的JS(含ID、时间戳等)每次都不一样。

  • 给registerJs加唯一$key参数:$this->view->registerJs($js, View::POS_READY, 'my-button-init')
  • 静态资源(如通用工具函数)优先提前提到Layout里,Widget只负责调用
  • 避免在run()里register,那里更适合拼HTML;资源注册全收口到init()

Widget复用真正卡点不在写法,而在上下文隔离和资源生命周期管理——这两块松动,越复用越不可控。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6439

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2724

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6104

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5729

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7394

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

10834

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5539

2025.07.29

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn