yii2中写自定义类,选择适合的基础类快速开始业务逻辑编写
在 Yii2 中编写自定义类时,继承框架基础类的核心原则是:根据自定义类的功能场景,选择最贴合的「抽象基类/接口」或「功能基类」,避免盲目继承(如直接继承 yii\base\Object 已过时,Yii2.0.13+ 推荐 yii\base\BaseObject)。
以下按「功能场景分类」,整理常用的可继承基础类,附使用场景和代码示例,覆盖绝大多数开发需求:
一、核心基础类(所有自定义类的通用父类)
这类类是 Yii2 所有组件的根基,提供「属性访问、事件触发、依赖注入」等核心能力,适合所有需要框架核心特性的自定义类。
| 框架基础类 | 核心功能 | 适用场景 | 代码示例 |
|---|---|---|---|
yii\base\BaseObject | 提供 __get()/__set()、hasProperty()、init() 等属性和初始化能力(Yii2.0.13+ 推荐) | 所有需要「属性访问、初始化逻辑」的自定义类 | php namespace app\components; use yii\base\BaseObject; class MyTool extends BaseObject { public $name; public function init() { parent::init(); // 初始化逻辑(如参数校验) if (empty($this->name)) { throw new \Exception('名称不能为空'); } } } |
yii\base\Component | 继承 BaseObject,额外提供「事件机制、行为(Behavior)支持」 | 需事件触发、行为扩展的类(如组件、服务) | php namespace app\components; use yii\base\Component; class MyService extends Component { const EVENT_AFTER_DO = 'afterDo'; public function doSomething() { // 触发事件 $this->trigger(self::EVENT_AFTER_DO); } } // 使用时绑定事件 $service = new MyService(); $service->on(MyService::EVENT_AFTER_DO, function() { echo '执行后触发'; }); |
yii\base\Object | 旧版核心基类(Yii2.0.13 前),功能与 BaseObject 一致,已被弃用 | 兼容旧版本代码(不推荐新增) | - |
二、数据模型类(处理数据验证、数据库交互)
若自定义类需「数据验证、数据库 CRUD」,优先继承以下模型基类,直接复用 Yii2 的数据处理能力。
| 框架基础类 | 核心功能 | 适用场景 | 代码示例 |
|---|---|---|---|
yii\base\Model | 提供「属性验证、场景支持、错误信息管理」(无数据库交互) | 表单提交、接口参数验证(非数据库模型) | php namespace app\models; use yii\base\Model; class LoginForm extends Model { public $username; public $password; public function rules() { return [ [['username', 'password'], 'required'], ['password', 'string', 'min' => 6], ]; } } // 使用时验证 $form = new LoginForm(['username' => 'test', 'password' => '123456']); if ($form->validate()) { // 验证通过 } |
yii\db\ActiveRecord | 继承 Model,额外提供「数据库 CRUD、关联查询、属性映射」 | 数据库表对应的模型(核心推荐) | php namespace app\models; use yii\db\ActiveRecord; class User extends ActiveRecord { public static function tableName() { return 'user'; // 对应数据库表名 } } // 数据库操作 $user = User::findOne(1); $user->username = 'newName'; $user->save(); |
yii\db\BaseActiveRecord | ActiveRecord 的抽象基类,可用于自定义 ORM 逻辑(如非关系型数据库) | 扩展数据库驱动、自定义 ORM 时使用 | - |
yii\base\DynamicModel | 动态模型,无需预先定义属性,适合临时数据验证(如单次接口参数) | 临时数据验证、动态表单(无需创建实体类) | php $model = DynamicModel::validateData([ 'email' => 'test@example.com', 'age' => 20, ], [ ['email', 'email'], ['age', 'integer', 'min' => 18], ]); if ($model->hasErrors()) { // 处理错误 } |
三、控制器/动作类(Web 接口/页面逻辑)
用于编写 Web 接口、页面渲染逻辑,继承后可直接复用「请求处理、响应输出、权限控制」等能力。
| 框架基础类 | 核心功能 | 适用场景 | 代码示例 |
|---|---|---|---|
yii\web\Controller | Web 应用核心控制器,提供「视图渲染、请求获取、响应处理、行为支持」 | 普通 Web 页面、HTML 接口控制器 | php namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { public function actionIndex() { // 渲染视图 return $this->render('index'); } } |
yii\rest\Controller | 专为 RESTful 接口设计,提供「JSON 响应、HTTP 方法映射、接口权限」 | RESTful API 控制器(如前后端分离接口) | php namespace app\controllers; use yii\rest\Controller; class ApiController extends Controller { public function actionUser($id) { return ['id' => $id, 'name' => 'test']; // 自动转为 JSON 响应 } } |
yii\rest\ActiveController | 继承 rest\Controller,自动实现「CRUD 接口」(无需手动写增删改查) | 快速实现 RESTful CRUD 接口(如资源管理) | php namespace app\controllers; use yii\rest\ActiveController; class UserController extends ActiveController { public $modelClass = 'app\models\User'; // 关联数据模型 } // 自动生成接口:GET /user(列表)、GET /user/1(详情)、POST /user(新增) |
yii\console\Controller | 命令行控制器,用于编写定时任务、脚本(如数据迁移、批量处理) | 控制台命令、定时任务(如 yii xxx/xxx) | php namespace app\commands; use yii\console\Controller; class TestController extends Controller { public function actionIndex() { echo '控制台命令执行成功'; } } // 执行:php yii test/index |
四、过滤器/行为类(请求拦截、功能扩展)
用于「请求拦截、权限校验、日志记录、缓存控制」等横切逻辑,继承后可嵌入控制器/组件的生命周期。
| 框架基础类 | 核心功能 | 适用场景 | 代码示例 |
|---|---|---|---|
yii\base\ActionFilter | 动作过滤器基类,提供 beforeAction()(动作执行前)、afterAction()(执行后)钩子 | 接口权限校验、日志记录、请求频率限制 | php namespace app\filters; use yii\base\ActionFilter; class AuthFilter extends ActionFilter { public function beforeAction($action) { // 动作执行前校验 if (!Yii::$app->user->isGuest) { return true; } Yii::$app->response->statusCode = 401; return false; } } // 在控制器中使用 public function behaviors() { return [ 'auth' => ['class' => AuthFilter::class], ]; } |
yii\filters\AccessControl | 内置权限过滤器,支持「角色权限、IP 白名单、HTTP 方法限制」 | 快速实现权限控制(如仅管理员访问) | php public function behaviors() { return [ 'access' => [ 'class' => \yii\filters\AccessControl::class, 'rules' => [ ['allow' => true, 'roles' => ['@'], // 仅登录用户允许 'actions' => ['index'], ], ], ], ]; } |
yii\base\Behavior | 行为基类,用于给组件动态添加属性/方法(无侵入扩展) | 组件功能扩展(如给模型添加日志方法) | php namespace app\behaviors; use yii\base\Behavior; use yii\db\ActiveRecord; class LogBehavior extends Behavior { public function events() { return [ ActiveRecord::EVENT_AFTER_INSERT => 'afterInsert', ]; } public function afterInsert($event) { // 模型新增后记录日志 Yii::info('新增数据:' . $event->sender->id); } } // 给模型添加行为 public function behaviors() { return ['log' => ['class' => LogBehavior::class]]; } |
五、工具/辅助类(特定功能场景)
针对「缓存、日志、验证器、命令行」等特定场景,继承对应基类可复用框架内置能力。
| 框架基础类 | 核心功能 | 适用场景 | 代码示例 |
|---|---|---|---|
yii\caching\Cache | 缓存抽象基类,提供 get()/set()/delete() 等缓存操作接口 | 自定义缓存驱动(如 Redis 扩展、本地文件缓存) | php namespace app\caching; use yii\caching\Cache; class MyCache extends Cache { protected function getValue($key) { // 自定义获取缓存逻辑 } protected function setValue($key, $value, $duration) { // 自定义设置缓存逻辑 } } |
yii\log\Target | 日志目标基类,用于自定义日志存储方式(如写入数据库、第三方日志服务) | 扩展日志存储(如 ELK、阿里云日志) | php namespace app\log; use yii\log\Target; class DbTarget extends Target { public function export() { $logs = $this->getLogs(); // 将日志写入数据库 foreach ($logs as $log) { Yii::$app->db->createCommand()->insert('sys_log', [ 'message' => $log[0], 'level' => $log[1], ])->execute(); } } } |
yii\validators\Validator | 验证器基类,用于自定义数据验证规则(如手机号、身份证号校验) | 扩展验证规则(框架未提供的自定义校验) | php namespace app\validators; use yii\validators\Validator; class PhoneValidator extends Validator { public function validateAttribute($model, $attribute) { $value = $model->$attribute; if (!preg_match('/^1[3-9]\d{9}$/', $value)) { $this->addError($model, $attribute, '手机号格式错误'); } } } // 在模型中使用 public function rules() { return [ ['phone', PhoneValidator::class], ]; } |
yii\console\Action | 命令行动作基类,用于编写复杂命令行逻辑(拆分命令为多个动作) | 复杂控制台命令(如批量导入数据的子步骤) | php namespace app\commands\actions; use yii\console\Action; class ImportAction extends Action { public function run($file) { // 执行导入逻辑 echo "从 {$file} 导入数据"; } } // 在命令行控制器中绑定 public function actions() { return [ 'import' => ImportAction::class, ]; } // 执行:php yii test/import --file=data.csv |
六、继承原则与避坑要点
- 最小继承原则:不需要的功能不继承(如仅需属性验证 → 继承
Model,无需继承ActiveRecord); - 优先接口/抽象类:框架提供的抽象基类(如
Cache、Validator)定义了标准接口,继承后需实现必填方法(如Cache的getValue()); - 避免多层继承:Yii2 推荐「组合优于继承」,复杂功能优先用「行为(Behavior)」扩展,而非多层继承;
- 注意版本兼容性:
BaseObject是 Yii2.0.13+ 新增,若项目版本低于该版本,需用Object; - 初始化逻辑写在
init()中:继承BaseObject/Component时,不要重写__construct(),而是通过init()实现初始化(框架会自动调用)。
总结
选择继承的框架类,核心看「自定义类的功能场景」:
- 数据验证 →
yii\base\Model; - 数据库交互 →
yii\db\ActiveRecord; - Web 接口 →
yii\rest\Controller; - 请求拦截 →
yii\base\ActionFilter; - 通用组件 →
yii\base\Component(需事件/行为)或yii\base\BaseObject(仅需属性/初始化)。
按场景选择合适的基类,可最大化复用框架能力,减少重复代码,同时保证代码符合 Yii2 的设计规范。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1390.html
转载时须注明出处及本声明