美文网首页Phal 开发笔记
Phal 的 ADM 模式 (Api-Domain-Model)

Phal 的 ADM 模式 (Api-Domain-Model)

作者: 爱绑架的猫 | 来源:发表于2019-03-12 16:30 被阅读0次

    Phal 推荐使用 ADM 模式主要是一种代码的调用的思想,是一种从大到小,由远及近,由粗到细的思想,简单来说, Api 这一层主要负责数据的检验和处理,然后把初步处理的数据送给 Domain 层,调用 Domain 层的方法实现更复杂更细节的操作,而在 Domain 层,对于数据库的 CURD 操作则全都由 Model 层来操作,Domain 层负责处理数据和调用Model 层获取数据等,最终把结果返回给 Api 层,Api 层把需要的数据整理好以后发送给客户端。
    这个 A-D-M 的调用方向是不可逆的,也就是说 Model 层不可以调用 Domain 或者 Api 层的方法,同样 Domain 层也不可以调用 Api 层的方法,这样保证代码逻辑清晰,方便寻找错误和后期维护。

    以下是 Phal 提供的各个层应该做的一些事情的大概描述:

    Api接口服务层应该做:

    • 应该:对用户登录态进行必要的检测
    • 应该:控制业务场景的主流程,创建领域业务实例,并进行调用
    • 应该:进行必要的日记纪录
    • 应该:返回接口结果
    • 应该:调度领域业务层

    Api接口服务层不应该做:

    • 不应该:进行业务规则的处理或者计算
    • 不应该:关心数据是否使用缓存,或进行缓存相关的直接操作
    • 不应该:直接操作数据库
    • 不应该:将多个接口合并在一起

    Domain领域业务层应该做:

    • 应该:体现特定领域的业务规则
    • 应该:对数据进行逻辑上的处理
    • 应该:调度数据模型层或其他领域业务层

    Domain领域业务层不应该做:

    • 不应该:直接实现数据的操作,如添加并实现缓存机制

    Model数据模型层应该:

    • 应该:进行数据库的操作
    • 应该:实现缓存机制

    Api 接口层

    ​ Api接口层称为接口服务层,负责对客户端的请求进行响应,处理接收客户端传递的参数,进行高层决策并对领域业务层进行调度,最后将处理结果返回给客户端。

    这里我们只讲一下接口方法的对参数的处理方法

    <?php
    namespace App\Api;
    
    use PhalApi\Api;
    
    class User extends Api {
        
        /**
        * 登录接口
        * @desc 用户登录接口
        * 
        */
        public function login() {
            return 'this is login function !';
        }
        
        /**
        * 参数接收接口
        */
        public function getRules() {
            return array(
                'login' => array(// login 是指的这个类中的方法名
                    'username' => array(// username 是login 方法 的参数名
                        'require' => true,    // 是否必须
                        'min' => 1,           // 小于等于几位
                        'max' => 10,          // 大于等于几位
                        'name' => 'username', // 传输时的名称 ?username=xxx
                        'default' => '张三',  // 如果不传默认值
                        'type' => 'string',   // 传输类型限制, int,string,boolean...
                        'desc' => '用户名',    // 参数描述
                        'source' => 'post',   // 传输方式
                        'regex' => '正则',    // 正则验证方式
                        'format' => 'utf8'    // 传输编码
                    )
                )
            );
        }
    }
    
    ?>
    

    Domain 领域层

    PhalApi使用的是ADM分层模式,Domain是连接Api层与Model层的桥梁。

    这里简单写一段代码展示一下 Domain 层操作。

    /src/app/Domain/Good.php

    <?php
    namespace App\Domain;
    
    // 获取 Good model 
    use App\Model\Goods as Goods;
    
    class Good {
    
        // 获取所有商品
        public function getOne() {
            $good = new Goods();
            $data = $good->get(1);
            return $data;
        }
    }
    ?>
    

    Model 模型层

    Model层称为数据模型层,负责技术层面上对数据信息的提取、存储、更新和删除等操作,数据可来自内存,也可以来自持久化存储媒介,甚至可以是来自外部第三方系统。虽然PhalApi的Model层是广义上的数据层,但考虑到大部分数据都是来自于数据库的操作,所以这一章将重点讲述如何进行数据库操作。

    数据库配置

    /config/dbs.php

    return array(
        /**
         * DB数据库服务器集群
         */
        'servers' => array(
            'db_master' => array(                         //服务器标记
                'host'      => '127.0.0.1',             //数据库域名
                'name'      => 'phalapi',               //数据库名字
                'user'      => 'root',                  //数据库用户名
                'password'  => '',                      //数据库密码
                'port'      => 3306,                  //数据库端口
                'charset'   => 'UTF8',                  //数据库字符集
            ),
        ),
    
        /**
         * 自定义路由表
         */
        'tables' => array(
            //通用路由
            '__default__' => array(
                'prefix' => 'tbl_',
                'key' => 'id',
                'map' => array(
                    array('db' => 'db_master'),
                ),
            ),
        ),
    );
    
    NotORM

    NotORM是一个优秀的开源PHP类库,可用于操作数据库。PhalApi的数据库操作,主要是依赖此NotORM来完成。

    获取 NotORM 实例

    在PhalApi中,全部数据库操作都要经过NotORM实例来进行

    这里我们主要讲在 model 中调用 NotORM 实例的方法

    /src/Model/Good.php

    <?php
    namespace App\Model;    
    // 引入 NotORM  
    use PhalApi\Model\NotORMModel as NotORM;
    // 让 Model 类继承这个类
    class Good extends NotORM {
        
        public function getAll() {
            // 获取当前这个类所代表的表的 ORM 实例 $this->getORM() 代表的是 tbl_good 表
            $good = $this->getORM();   
            $data = $good->fetchOne(); // 从 tbl_good 表中获取一条记录
            return $data;    
        }
    }   
        
    ?>
    

    上面只是 NotORM 的一个简单的实例,它还有很多操作数据库的方法,大家可以去官方文档中详细去看,这里只做简单介绍。

    相关文章

      网友评论

        本文标题:Phal 的 ADM 模式 (Api-Domain-Model)

        本文链接:https://www.haomeiwen.com/subject/ibynpqtx.html