EDUSOHO踩坑笔记之六:edusoho架构及模块分析

从目录结构、入口文件、配置、控制器、服务层、模型、模块组成等几个角度,进行架构的描述。本文档是以8.0的版本为基准的说明,与其他版本会有些区别。

一、目录结构

入口:{$HOME}\web
控制器:{$HOME}\src\AppBundle\Controller\模块名Controller.php
模型:{$HOME}\src\Biz\Controller\模块名\Dao\Impl\表面DaoImpl.php
视图:{$HOME}\app\Resources\views\视图文件夹路径\名称.html.twig
路由文件:{$HOME}\api\config\routing.php

二、入口文件

{$HOME}\web\app.php

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$request = Request::createFromGlobals();
$kernel->setRequest($request);
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

三、配置

//路由
{$HOME}\src\AppBundle\Resources\config\routing.yml
{$HOME}\src\AppBundle\Resources\config\routing_admin.yml

homepage:path:  /defaults: { _controller: AppBundle:Default:index }
...
order_calculate_price:path: /order/price/calculatedefaults: { _controller: AppBundle:Order/Order:price, limit: '' }
admin_discovery_column_category_tree:path: /discovery_column/category/treedefaults: { _controller: AppBundle:Admin/DiscoveryColumn:categoryTree }

四、控制器

{HOME}\src\AppBundle

以 http://edu.test/user/4 为例:
$app->get(_u('/user/{id}'), 'res.User:get');
{$HOME}\src\AppBundle\Controller\UserController.php

protected function tryGetUser($id)
{$user = $this->getUserService()->getUser($id);if (empty($user)) {throw $this->createNotFoundException();}return $user;
}

五、服务层

以 http://edu.test/user/4/about 为例:
{HOME}\src\Biz\User\Service\UserService.php
{$HOME}\src\AppBundle\Controller\UserController.php

public function aboutAction(Request $request, $id)
{$user = $this->tryGetUser($id);return $this->_aboutAction($user);
}protected function _aboutAction($user)
{$userProfile = $this->getUserService()->getUserProfile($user['id']);//不存在 getUserProfile() 方法时,则调用 get 方法,表为 user_profilereturn $this->render('user/about.html.twig', array('user' => $user,'userProfile' => $userProfile,'type' => 'about',));
}

{$HOME}\src\Biz\User\Service\Impl\UserServiceImpl.php

<?phpnamespace Biz\User\Service\Impl;use Biz\BaseService;
use Biz\User\Dao\UserDao;
...class UserServiceImpl extends BaseService implements UserService{public function getUser($id, $lock = false){$user = $this->getUserDao()->get($id, array('lock' => $lock));return !$user ? null : UserSerialize::unserialize($user);}...public function getUserProfile($id){return $this->getProfileDao()->get($id);}
}

{$HOME}\vendor\codeages\biz-framework\src\Dao\DaoProxy.php

<?phpnamespace Codeages\Biz\Framework\Dao;use Codeages\Biz\Framework\Dao\Annotation\MetadataReader;class DaoProxy
{/*** 代理 get 开头的方法调用** @param string $method 被调用的 Dao 方法名* @param array $arguments 调用参数* @return array|null*/protected function get($method, $arguments){$lastArgument = end($arguments);reset($arguments);// lock模式下,因为需要借助mysql的锁,不走cacheif (is_array($lastArgument) && isset($lastArgument['lock']) && true === $lastArgument['lock']) {$row = $this->callRealDao($method, $arguments);$this->unserialize($row);return $row;}if ($this->arrayStorage) {$key = $this->getCacheKey($this->dao, $method, $arguments);if (!empty($this->arrayStorage[$key])) {return $this->arrayStorage[$key];}}$strategy = $this->buildCacheStrategy();if ($strategy) {$cache = $strategy->beforeQuery($this->dao, $method, $arguments);// 命中 cache, 直接返回 cache 数据if (false !== $cache) {return $cache;}}$row = $this->callRealDao($method, $arguments);$this->unserialize($row);// 将结果缓存至 ArrayStorage$this->arrayStorage && ($this->arrayStorage[$this->getCacheKey($this->dao, $method, $arguments)] = $row);if ($strategy) {$strategy->afterQuery($this->dao, $method, $arguments, $row);}return $row;}
}

六、模型

{$HOME}\src\Biz\User\Dao\Impl\UserDaoImpl.php

<?phpnamespace Biz\User\Dao\Impl;use Biz\User\Dao\UserDao;
use Codeages\Biz\Framework\Dao\AdvancedDaoImpl;class UserDaoImpl extends AdvancedDaoImpl implements UserDao{protected $table = 'user';...
}

{$HOME}\vendor\codeages\biz-framework\src\Dao\GeneralDaoImpl.php

<?phpnamespace Codeages\Biz\Framework\Dao;use Codeages\Biz\Framework\Context\Biz;abstract class GeneralDaoImpl implements GeneralDaoInterface{...public function get($id, array $options = array()){$lock = isset($options['lock']) && true === $options['lock'];$sql = "SELECT * FROM {$this->table()} WHERE id = ?".($lock ? ' FOR UPDATE' : '');return $this->db()->fetchAssoc($sql, array($id)) ?: null;}...
}

七、模块分析

教师端

在教课程 /my/teaching/course_sets
教学课表 /my/teaching/live/calendar
在教班级 /my/teaching/classrooms
学员问题 /my/teaching/threads/question
学员话题 /my/teaching/threads/discussion
试卷批阅 /my/testpaper/check
作业批阅 /my/homework/check
教学资料库 /material/lib/browse

学生端

我的课程 /my/courses/learning
我的班级 /my/classrooms
我的问答 /my/questions
我的话题 /my/discussions
我的笔记 /my/notebooks
我的作业 /my/homework/finished/list
我的考试 /my/testpaper/list
我的小组 /my/group

管理员

用户 /admin/user
课程 /admin/course_set/normal/index
运营 /admin/article
交易 /admin/order/manage
教育云 /admin/setting/my/cloud/overview
微营销 /admin/login/marketing
分销 /admin/login/distributor
移动端 /admin/wechat_app
系统 /admin/setting/site

EDUSOHO踩坑笔记之六:edusoho架构及模块分析相关推荐

  1. EDUSOHO踩坑笔记之五:edusoho的后台目录结构

    EDUSOHO踩坑笔记之五:edusoho的后台目录结构 EDUSOHO从架构上讲把前后台整合在一起,做到了代码的最大限度的复用,这从体系架构设计上来说,没有瑕疵可以挑剔.但从安全管理上来说,这就是仁 ...

  2. EDUSOHO踩坑笔记之四十二:资讯

    EDUSOHO踩坑笔记之四十二:资讯 获取资讯列表信息 GET /articles/{id} 权限 老API,需要认证 参数 字段 是否必填 描述 sort string 否 排序,'created' ...

  3. EDUSOHO踩坑笔记之三十三:班级

    EDUSOHO踩坑笔记之三十三:班级 班级 班级 获取班级信息 获取班级列表 班级成员 获取班级计划 加入班级 营销平台加入班级 班级 班级 获取班级信息 GET /classrooms/{class ...

  4. iphone se 一代 不完美越狱 14.6 视频壁纸教程(踩坑笔记)

    iphone se 一代 不完美越狱 14.6 加 视频壁纸教程-踩坑笔记 越狱流程 1.爱思助手制作启动u盘 坑点: 2.越狱好后 视频壁纸软件 1.源 2.软件安装 越狱流程 1.爱思助手制作启动 ...

  5. Linux内核踩坑笔记

    systemtap embedded C踩坑笔记戳这: https://blog.csdn.net/qq_41961459/article/details/103093912 task_struct的 ...

  6. 阿里云部署Tiny Tiny RSS踩坑笔记

    阿里云部署Tiny Tiny RSS踩坑笔记 前言 入坑了RSS,之前的配置是阿里云部署RSSHub,配合Inoreader进行文章阅读,详情见RSS入坑指南.阿里云部署RSSHub踩坑笔记.在202 ...

  7. 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)

    目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...

  8. 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)

    目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...

  9. 昆仑通态触摸屏1003故障码,踩坑笔记

    昆仑通态触摸屏1003故障码,踩坑笔记 第一次使用这个昆仑通态触摸屏,使用modbusRTU与金田变频器做通讯. 触摸屏在线后报1003通讯错误代码,现象是控制指令正常,但是读取不正常.读取变频器状态 ...

最新文章

  1. python第二十九课——文件读写(复制文件)
  2. 我的问道游戏主题皮肤
  3. Hacker News 12 月招聘趋势:React 已霸榜 19 个月
  4. Python技术分享:教你如何爆破隔壁WiFi密码
  5. mysql 免安装初始化_mysql免安装版配置步骤详解分享
  6. Spark精华问答 | 为什么要学Spark?
  7. 引用 java的一些基本概念
  8. mac上配置java jdk环境
  9. 计算机二级vfp程序语言,2012年计算机二级VFP语言基础学习教程
  10. cryptojs vue 使用_vue 中引入cryptoJS
  11. Ps图片文字处理与python多张图片合成
  12. confluence 无法保存页面 排错记录
  13. Vue中:error ‘XXXXX‘ is not defined no-undef解决办法
  14. 计算机应用说课稿,中职计算机说课稿
  15. 常见的SQL注入类型
  16. 手把手教你TSYS建站
  17. 无法找到模块“vue-awesome-swiper/dist/ssr”的声明文件
  18. 安卓java.lang.IllegalStateException: The specified child already has a parent.解决方案
  19. 关于B2C电子商务顾客忠诚度影响因素的问卷调查
  20. 多组差异分析的可视化,这样做最省心!

热门文章

  1. RGB通道和YCBCR通道相互转换——MATLAB实现
  2. 五、IPSec开源项目strongSwan
  3. 第二节 图搜索与问题求解1
  4. 毫米波安检“上位”,人类的安全防护又多了一种可能
  5. 【Vscode】预览md文件
  6. 长得类似铁甲小宝的机器人_这是一部专属于90后的动画片,铁甲小宝里的12个机器人你还记得?...
  7. flot中文说明文档 简版
  8. 单基因gsea_单基因TCGA联合GEO干湿结合在胃癌中再发4分+
  9. Python如何在main中调用函数内的函数
  10. poj2411Mondriaan's Dream题解