Yii2高级模板默认不是前后台分离,仅为物理目录隔离,实为共享配置、路由、认证的单体结构;真分离需切断视图耦合、重写入口、隔离认证。

Yii2 高级模板默认的 frontend/backend 是前后台分离吗?
不是。它只是物理目录隔离,frontend 和 backend 共享同一套应用配置、路由机制和用户认证逻辑,本质仍是单体结构,连 session 都默认共用。
真要前后台分离(比如前端用 Vue/React 调 API,后端纯提供接口),得主动切断视图层耦合、重写入口逻辑、隔离认证方式。
-
frontend/web/index.php和backend/web/index.php都加载了yii\web\Application,但它们的bootstrap、components、modules可以完全不同 - 若不改,默认
user组件指向同一个User类,frontend登录后backend也能直接访问受保护页面 - API 请求不该走
frontend或backend的Controller::render(),否则返回 HTML,前端拿不到 JSON
如何让 backend 变成纯 API 服务?
核心是把 backend 从“能渲染页面的 Web 应用”变成“只输出 JSON 的 RESTful 接口服务”,重点改三处:入口、控制器基类、响应格式。
- 在
backend/config/main.php中移除'view'组件配置,或显式禁用模板引擎:'view' => ['class' => 'yii\web\View', 'renderers' => []] - 所有 API 控制器继承自自定义基类(如
backend\controllers\ApiController),而非yii\web\Controller;该基类重写beforeAction(),统一设置\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON - 避免在控制器里调用
$this->render();改用return ['status' => 'success', 'data' => $model->toArray()]—— Yii2 会自动序列化为 JSON - 若需跨域,加
'cors' => ['class' => \yii\filters\Cors::class]到控制器的behaviors(),别漏掉Access-Control-Allow-Headers配置
frontend 和 backend 共享模型时要注意什么?
共享 common\models 没问题,但别共享 common\models\User 的登录逻辑或密码验证方式 —— 前台用户和后台管理员通常权限不同、密码策略不同、甚至存储字段都不同。
立即学习“PHP免费学习笔记(深入)”;
- 不要让
frontend\models\LoginForm和backend\models\LoginForm都 extends 同一个类;各自实现,只复用校验规则(如rules()中的required、email) -
common\models\User最好只含通用字段(id,username,created_at),把is_admin、last_login_ip等角色相关字段拆到backend\models\AdminUser或独立关联表 - 如果用
auth_key做免登录,frontend 和 backend 必须用不同 key 字段,否则一方登出会影响另一方 - 数据库迁移脚本别混写:
common/migrations放基础表,backend/migrations放管理专用表(如admin_log)
为什么用高级模板却部署成单域名 + 前端构建产物?
因为多数项目不需要两个独立后台入口,而是「一个管理后台(Vue SPA)+ 一套 Yii2 API」,此时 backend/web 目录反而成了累赘。
- 删掉
backend/web/index.php和整个backend/views,只留backend/controllers和backend/config;把它当成纯模块,不对外暴露 Web 入口 - 把 API 配置合并进
frontend/config/main.php,通过 URL 规则区分:'api/<controller:>/<action:>' => '<controller>/<action>'</action></controller></action:></controller:> - 这样前端构建产物(dist)扔进
frontend/web/,所有请求由frontend/web/index.php统一接管 —— 静态资源走 nginx,API 请求转发给 Yii2 - 注意:此时
frontend的user组件必须支持多身份(普通用户 / 管理员),不能只依赖 session,得靠 token 或 header 鉴权
真正麻烦的从来不是目录怎么放,而是权限上下文怎么流转、错误提示怎么对齐、登录态怎么在前后端之间可信传递 —— 这些没法靠模板解决,得一行行代码对齐。











