我是靠谱客的博主 傻傻白昼,最近开发中收集的这篇文章主要介绍EDUSOHO踩坑笔记之六:edusoho架构及模块分析EDUSOHO踩坑笔记之六:edusoho架构及模块分析七、模块分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

一、目录结构

入口:{$HOME}web
控制器:{$HOME}srcAppBundleController模块名Controller.php
模型:{$HOME}srcBizController模块名DaoImpl表面DaoImpl.php
视图:{$HOME}appResourcesviews视图文件夹路径名称.html.twig
路由文件:{$HOME}apiconfigrouting.php

二、入口文件

{$HOME}webapp.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}srcAppBundleResourcesconfigrouting.yml
{$HOME}srcAppBundleResourcesconfigrouting_admin.yml

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

四、控制器

{HOME}srcAppBundle

以 http://edu.test/user/4 为例:
$app->get(_u('/user/{id}'), 'res.User:get');
{$HOME}srcAppBundleControllerUserController.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}srcBizUserServiceUserService.php
{$HOME}srcAppBundleControllerUserController.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_profile
    return $this->render('user/about.html.twig', array(
        'user' => $user,
        'userProfile' => $userProfile,
        'type' => 'about',
    ));
}

{$HOME}srcBizUserServiceImplUserServiceImpl.php

<?php

namespace BizUserServiceImpl;

use BizBaseService;
use BizUserDaoUserDao;
...

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}vendorcodeagesbiz-frameworksrcDaoDaoProxy.php

<?php

namespace CodeagesBizFrameworkDao;

use CodeagesBizFrameworkDaoAnnotationMetadataReader;

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的锁,不走cache
        if (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}srcBizUserDaoImplUserDaoImpl.php

<?php

namespace BizUserDaoImpl;

use BizUserDaoUserDao;
use CodeagesBizFrameworkDaoAdvancedDaoImpl;

class UserDaoImpl extends AdvancedDaoImpl implements UserDao{

	protected $table = 'user';
	...
}

{$HOME}vendorcodeagesbiz-frameworksrcDaoGeneralDaoImpl.php

<?php

namespace CodeagesBizFrameworkDao;

use CodeagesBizFrameworkContextBiz;

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架构及模块分析EDUSOHO踩坑笔记之六:edusoho架构及模块分析七、模块分析的全部内容,希望文章能够帮你解决EDUSOHO踩坑笔记之六:edusoho架构及模块分析EDUSOHO踩坑笔记之六:edusoho架构及模块分析七、模块分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部