1. @app
包含哪些部分?
想象一下,你在一家咖啡店:
- 你需要一个工作区(
@app
)来存放所有的菜单(文件)、工具(配置)和员工(代码逻辑)。 - 在 Yii2 中,
@app
是应用程序的根目录别名,包含了所有与应用相关的核心内容。
(1) 核心组成部分
-
配置文件:
- 配置文件定义了应用的行为,如路由规则、数据库连接、组件注册等。
- 示例:
// config/web.php return [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=test', 'username' => 'root', 'password' => '', ], ], ];
-
控制器(Controllers):
- 控制器负责处理用户请求并返回响应。
- 示例:
namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { public function actionIndex() { return $this->render('index'); } }
-
模型(Models):
- 模型用于处理数据逻辑(如数据库操作、业务规则)。
- 示例:
namespace app\models; use yii\db\ActiveRecord; class User extends ActiveRecord { public static function tableName() { return 'user'; } }
-
视图(Views):
- 视图负责渲染 HTML 页面,展示数据给用户。
- 示例:
<!-- views/site/index.php --> <h1>Welcome to My App!</h1> <p>This is the home page.</p>
-
迁移文件(Migrations):
- 迁移文件用于管理数据库结构的变化。
- 示例:
use yii\db\Migration; class m230101_000001_create_table_user extends Migration { public function up() { $this->createTable('user', [ 'id' => $this->primaryKey(), 'username' => $this->string()->notNull(), ]); } public function down() { $this->dropTable('user'); } }
-
运行时文件(Runtime):
runtime
目录存储临时文件(如日志、缓存)。- 示例:
runtime/logs/app.log
-
公共资源(Assets):
assets
目录存放静态资源(如 CSS、JavaScript、图片)。- 示例:
web/assets/css/style.css
-
入口脚本(Entry Script):
- 入口脚本是应用的启动点,通常为
web/index.php
。 - 示例:
defined('YII_DEBUG') or define('YII_DEBUG', true); require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/../config/web.php'; (new yii\web\Application($config))->run();
- 入口脚本是应用的启动点,通常为
2. 使用场景是什么?
(1) 快速开发 Web 应用
- 场景:基于 Yii2 的 MVC 架构快速构建 Web 应用。
- 示例:
./yii serve
(2) 数据库管理
- 场景:通过迁移文件管理数据库结构的变化。
- 示例:
./yii migrate
(3) RESTful API 开发
- 场景:创建 RESTful API,供前端或第三方调用。
- 示例:
namespace app\controllers; use yii\rest\ActiveController; class UserController extends ActiveController { public $modelClass = 'app\models\User'; }
(4) 日志与调试
- 场景:记录应用日志、调试错误。
- 示例:
Yii::info('This is a log message.');
(5) 扩展集成
- 场景:集成第三方扩展(如
mdmsoft/yii2-admin
)以增强功能。 - 示例:
composer require mdmsoft/yii2-admin
3. 底层原理是什么?
(1) 别名机制
@app
别名:@app
是 Yii2 提供的别名,指向应用的根目录。- 示例:
echo \Yii::getAlias('@app'); // 输出 /path/to/project
(2) 自动加载
- Composer 自动加载:
- Yii2 借助 Composer 的自动加载机制加载类文件。
- 命名空间映射:
- 类名与文件路径通过 PSR-4 标准映射。
- 示例:
文件路径为namespace app\controllers; class SiteController {}
controllers/SiteController.php
。
(3) 请求处理流程
- 入口脚本:
- 用户请求首先到达入口脚本(
web/index.php
)。
- 用户请求首先到达入口脚本(
- 应用初始化:
- 加载配置文件,创建应用实例。
- 路由解析:
- 根据 URL 路由规则找到对应的控制器和动作。
- 响应生成:
- 控制器处理请求并返回响应。
(4) 组件化设计
- 核心组件:
- Yii2 提供了许多核心组件(如
db
、cache
、log
),可通过配置文件启用。
- Yii2 提供了许多核心组件(如
- 自定义组件:
- 可以注册自定义组件,扩展应用功能。
- 示例:
'components' => [ 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'useFileTransport' => true, ], ],
4. 图示说明
(1) @app
目录结构
@app/
+--------------------------+
| config/ | (配置文件)
+--------------------------+
| controllers/ | (控制器)
+--------------------------+
| models/ | (模型)
+--------------------------+
| views/ | (视图)
+--------------------------+
| migrations/ | (迁移文件)
+--------------------------+
| runtime/ | (运行时文件)
+--------------------------+
| web/ | (入口脚本和公共资源)
+--------------------------+
| vendor/ | (依赖库)
+--------------------------+
(2) 请求处理流程
用户请求 -> 入口脚本 -> 加载配置 -> 初始化应用 -> 路由解析 -> 控制器处理 -> 返回响应
5. 总结
(1) 核心组成部分
- 配置文件:定义应用行为。
- 控制器:处理用户请求。
- 模型:处理数据逻辑。
- 视图:渲染页面。
- 迁移文件:管理数据库结构。
- 运行时文件:存储临时文件。
- 公共资源:存放静态资源。
- 入口脚本:启动应用。
(2) 使用场景
- 快速开发 Web 应用。
- 数据库管理。
- RESTful API 开发。
- 日志与调试。
- 扩展集成。
(3) 底层原理
- 别名机制:
@app
别名指向应用根目录。 - 自动加载:通过 Composer 和 PSR-4 加载类文件。
- 请求处理流程:从入口脚本到响应生成。
- 组件化设计:核心组件与自定义组件。