
1. Yii框架概述与核心优势Yii读作易是一个基于PHP的高性能Web应用开发框架自2008年诞生以来已经迭代到Yii3版本。作为一个全栈式框架它特别适合开发需要快速交付的中大型Web应用。我最初接触Yii是在2015年一个电商项目上当时被它约定优于配置的设计哲学所吸引——开发者只需关注业务逻辑框架已经帮你处理好了90%的常规问题。Yii的核心竞争力主要体现在三个方面执行效率采用延迟加载技术和智能缓存机制基准测试显示Yii处理请求的速度比Laravel快20-30%安全性内置CSRF防护、XSS过滤、SQL注入预防等安全层默认配置就符合OWASP Top 10标准开发体验Gii代码生成器和强大的调试工具能显著提升开发效率提示Yii3相比Yii2进行了模块化重构核心包仅有3MB大小通过Composer可以按需安装组件2. 环境准备与安装指南2.1 系统要求检查在开始安装前请确保你的开发环境满足PHP ≥ 8.0推荐8.2Composer 2.xPDO扩展数据库必需MBString扩展多字节字符串处理验证命令php -v composer --version php -m | grep -E pdo|mbstring2.2 通过Composer安装官方推荐的基础项目模板安装命令composer create-project --prefer-dist yiisoft/yii-base-app myapp安装完成后目录结构说明myapp/ ├── config/ # 配置文件 ├── public/ # Web入口 ├── resources/ # 视图/资源文件 ├── runtime/ # 运行时文件 ├── vendor/ # 依赖库 └── tests/ # 测试代码2.3 初始化配置执行初始化命令设置环境cd myapp ./yii serve # 启动内置服务器访问 http://localhost:8080 应该能看到欢迎页面。3. 核心功能实操演练3.1 数据库配置与迁移在config/db.php配置数据库连接return [ dsn mysql:hostlocalhost;dbnameyii_app, username root, password , charset utf8mb4, ];创建第一个迁移文件./yii migrate/create init_db生成的迁移文件位于migrations/目录编辑up()方法定义表结构public function up() { $this-createTable(user, [ id $this-primaryKey(), username $this-string(64)-notNull()-unique(), password_hash $this-string(255)-notNull(), created_at $this-integer()-notNull(), ]); }执行迁移./yii migrate/up3.2 使用Gii生成CRUD访问 http://localhost:8080/gii 进入代码生成器选择Model GeneratorTable Name:userModel Class:User选择CRUD GeneratorModel Class:app\models\UserController Class:app\controllers\UserController生成的文件包括models/User.php数据模型controllers/UserController.php控制器views/user/*.php视图文件3.3 自定义业务逻辑在控制器中添加搜索功能public function actionIndex() { $searchModel new UserSearch(); $dataProvider $searchModel-search(Yii::$app-request-queryParams); return $this-render(index, [ searchModel $searchModel, dataProvider $dataProvider, ]); }对应的搜索模型models/UserSearch.phppublic function search($params) { $query User::find(); $dataProvider new ActiveDataProvider([ query $query, pagination [ pageSize 20, ], ]); if (!($this-load($params) $this-validate())) { return $dataProvider; } $query-andFilterWhere([like, username, $this-username]); return $dataProvider; }4. 高级功能与性能优化4.1 缓存配置Redis缓存示例修改config/cache.phpreturn [ redis [ class yii\redis\Cache, redis [ hostname localhost, port 6379, database 0, ], ], ];使用缓存加速数据查询$data Yii::$app-cache-getOrSet(top_users, function() { return User::find()-orderBy(rating DESC)-limit(10)-all(); }, 3600);4.2 队列系统配置数据库队列config/queue.phpreturn [ class yii\queue\db\Queue, db db, // 数据库组件ID tableName {{%queue}}, // 队列表名 channel default, // 队列频道 mutex yii\mutex\MysqlMutex, // 互斥锁 ];创建队列任务class SendEmailJob extends BaseObject implements \yii\queue\JobInterface { public $email; public $subject; public $content; public function execute($queue) { Yii::$app-mailer-compose() -setTo($this-email) -setSubject($this-subject) -setTextBody($this-content) -send(); } }推送任务到队列./yii queue/run # 启动队列监听Yii::$app-queue-push(new SendEmailJob([ email userexample.com, subject Welcome, content Thank you for registration, ]));5. 常见问题排查与调试技巧5.1 调试工具使用Yii内置的调试面板需安装yiisoft/yii-debug提供SQL查询分析请求/响应日志性能分析配置查看安装命令composer require --dev yiisoft/yii-debug5.2 典型错误解决方案问题1迁移报错表已存在Exception yii\db\Exception with message SQLSTATE[42S01]: Base table or view already exists解决方案./yii migrate/down # 回滚迁移 ./yii migrate/up # 重新执行问题2Gii生成代码时报错ReflectionException: Class app\models\User does not exist解决方法检查models/User.php是否存在确保命名空间正确运行composer dump-autoload问题3Nginx环境下URL美化失效修改Nginx配置location / { try_files $uri $uri/ /index.php?$args; }5.3 性能优化检查清单启用OPcachephp.iniopcache.enable1 opcache.memory_consumption256生产环境关闭调试模式config/web.phpdebug false, enableCoreCommands false,使用asset命令压缩静态资源./yii asset config/assets.php config/assets-prod.php6. 项目部署与持续集成6.1 生产环境部署流程代码打包排除开发文件rsync -avz --exclude.git --excludetests \ --excluderuntime/logs/* ./ userserver:/var/www/myapp安装生产依赖composer install --no-dev --optimize-autoloader执行迁移./yii migrate/up --interactive06.2 Docker化部署Dockerfile示例FROM php:8.2-fpm RUN apt-get update apt-get install -y \ libzip-dev \ docker-php-ext-install zip pdo_mysql WORKDIR /var/www COPY . . RUN composer install --no-dev --optimize-autoloader EXPOSE 9000 CMD [php-fpm]docker-compose.yml配置version: 3 services: app: build: . volumes: - .:/var/www depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: yii_app6.3 CI/CD集成示例.github/workflows/ci.yml配置name: CI on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - name: Setup PHP uses: shivammathur/setup-phpv2 with: php-version: 8.2 extensions: mbstring, pdo_mysql - name: Install dependencies run: composer install --no-interaction - name: Run tests run: ./vendor/bin/phpunit7. 生态扩展与社区资源7.1 常用扩展推荐yii2-debug调试工具栏composer require --dev yiisoft/yii-debugyii2-redisRedis集成composer require yiisoft/yii-redisyii2-queue队列系统composer require yiisoft/yii-queue7.2 学习资源导航官方文档https://www.yiiframework.com/doc中文社区https://www.yiichina.com视频教程Yii3入门YouTube慕课网《Yii2高级开发》书籍推荐《Yii框架深度剖析》《Web Application Development with Yii 2 and PHP》7.3 项目结构优化建议对于大型项目推荐采用模块化组织app/ ├── modules/ │ ├── admin/ # 后台模块 │ │ ├── controllers/ │ │ ├── models/ │ │ └── views/ │ └── api/ # API模块 ├── core/ # 核心组件 └── shared/ # 共享资源在config/web.php中注册模块modules [ admin [ class app\modules\admin\Module, ], ],8. 安全加固实践8.1 输入验证规范模型中的验证规则示例public function rules() { return [ [[email], trim], [[email], required], [[email], email], [[password], string, min 8], [[birthdate], date, format php:Y-m-d], ]; }8.2 CSRF防护机制表单中自动嵌入CSRF令牌?php $form ActiveForm::begin([id contact-form]); ? ? $form-field($model, name) ? ? $form-field($model, email) ? ? Html::submitButton(Submit) ? ?php ActiveForm::end(); ?AJAX请求需要手动添加$.ajax({ url: /submit, type: POST, data: { _csrf: yii.getCsrfToken(), // 其他数据... } });8.3 密码安全策略推荐使用PHP的password_hash// 生成哈希 $hash Yii::$app-security-generatePasswordHash($password); // 验证密码 if (Yii::$app-security-validatePassword($input, $hash)) { // 密码正确 }9. 测试驱动开发实践9.1 单元测试配置安装PHPUnitcomposer require --dev phpunit/phpunit示例测试类tests/unit/models/UserTest.phpclass UserTest extends \Codeception\Test\Unit { public function testValidation() { $user new User(); $user-username test; $user-email invalid.email; $this-assertFalse($user-validate()); $this-assertArrayHasKey(email, $user-errors); } }9.2 功能测试示例使用Codeception进行功能测试composer require --dev codeception/codeception ./vendor/bin/codecept bootstrap编写登录测试tests/functional/LoginCest.phpclass LoginCest { public function _before(FunctionalTester $I) { $I-amOnPage(/site/login); } public function loginWithValidCredentials(FunctionalTester $I) { $I-fillField(Username, admin); $I-fillField(Password, password); $I-click(Login); $I-see(Logout); } }10. 项目实战构建RESTful API10.1 快速创建API安装API模板composer create-project --prefer-dist yiisoft/yii-api-app myapi基础控制器示例class UserController extends \yii\rest\ActiveController { public $modelClass app\models\User; public function behaviors() { return ArrayHelper::merge(parent::behaviors(), [ authenticator [ class HttpBearerAuth::class, ], ]); } }10.2 JWT认证集成安装firebase/php-jwtcomposer require firebase/php-jwt创建认证组件namespace app\components; use yii\filters\auth\AuthMethod; use Firebase\JWT\JWT; use Firebase\JWT\Key; class JwtAuth extends AuthMethod { public function authenticate($user, $request, $response) { $token $request-getHeaders()-get(Authorization); if ($token preg_match(/^Bearer\s(.*?)$/, $token, $matches)) { try { $secret Yii::$app-params[jwtSecret]; $decoded JWT::decode($matches[1], new Key($secret, HS256)); return $user-loginByAccessToken($decoded-uid); } catch (\Exception $e) { return null; } } return null; } }10.3 API文档生成使用swagger-php生成OpenAPI文档composer require zircote/swagger-php在控制器中添加注解/** * OA\Get( * path/users, * summaryGet user list, * OA\Response(response200, descriptionSuccess) * ) */ public function actionIndex() { // ... }生成文档./vendor/bin/openapi app/controllers -o web/swagger.json