LUMEN API Controller 规范

技术文档网 2021-04-15

1. 第三方依赖库规范

在使用LUMEN实现API接口时,以下库必须需要包含在composer包依赖中,以实现代码编写的一些规范

  • dingo/api : 实现API接口库
  • vlucas/phpdotenv : 实现了配置文件读取的函数,包括env()函数等
  • marc-mabe/php-enum : 实现php的ENUM功能
  • barryvdh/laravel-ide-helper : IDE帮助,_ide_helper.php文件提供

2. Controller规范

  • 所有Controller的基类以编写定义的BasicController为准。BasicController实现了一些基本的HTTP请求和应答功能。如$requestHander变量处理请求,respond函数处理应答。Trait类UtilToolMethod实现了通用功能函数。

  • 所有的Controller不再使用Request对象,而使用BasicController中的$requestHandler变量。

  • $requestHandler变量使用不再推荐使用数组形式结构获得参数变量,而使用使用其暴露的方法

    $this->requestHandler->input('key1','');
    $this->requestHandler->all();
    $this->requestHandler->only(['key1','key2']);
    $this->requestHandler->file('file');
    $this->requestHandler->header('Authorization');
    $this->requestHandler->url();
    $this->requestHandler->path();
    
  • 对于请求参数的验证,统一使用validate方法

    $this->validate($this->requestHandler,[
          'key1'    => 'required'
    ]);
    
  • 对于自己业务有特殊需求的,在BasicController基础上,扩展Controller的功能和方法。 然后再让其它的Controller类继承这个定义的Controller

    /**
     * 应用授权用户基类,提供用户数据及用户操作方法
     */
    class UserAuthBasicControll extends BaiscController
    {
        /**
         * @var GuiderEmpUser
         */
        private $_empUser = null;
    
        public function __construct(Request $request,GuiderEmpUser $guiderEmpUser) {
              parent::__construct($reuqest);
            $this->_empUser = $guiderEmpUser;
        }
    
        /**
         * @return GuiderEmpUser
         */
        public function getEmpUser() { return $this->_empUser; }
    
        public function userSiteAccess($pointSiteId) { /* 实现权限验证.. */ }
    }
    
  • Controller层函数使用对象的自动注入依赖。

    class CustomerController
    {
    
        private $_crmService = null;
    
        public function __construct(CRMService $crmService) {
           $this->_crmService = $crmService;  // 自动注入依赖
        }
    
        public function customerEnterIn($userInfo) {
           $this->_crmService->registerCustomer($userInfo);
        }
    }
    
  • Controller层不能直接操作SQL,不能直接操作Model对象实现SQL功能。要实现数据库增删改,必须通过Model封装起来。以下方法在Controller中直接操作DB表都是被禁止的

    class SomeController
    {
        public function doSomeErrorThing() {
            DB::table('t1')->insert([...]);
            UserModel::where('user'=>'my')->update([...]);
            DB::table('users')->truncate();
        }
    
        /* 对于查询来说,简单的查询可以在Controller直接完成,复杂的查询需要通过Model层添加方法来完成 */
        public function userOperator() {
            $id = 100;
            $userInstance1    = User::find($id);
            $userInstance2    = (new User())->getUserInstanceById($id);
            $userAccesseList  = (new User())->getUserAccesses($id);
        }
    }
    
  • Controller通过调用Model层,自定义Service层,Event, Queue来完成自身的业务逻辑。但是在Controller层,尽量做到对于底层服务的底耦合,为了能够更好的测度,也尽量使用对象的依赖注入。

  • Controller层与其它层的一般关系如下

    Router ->> Controller : 数据请求
    Controller ->> Controller : 处理用户请求
    Controller ->> Model : 数据业务处理
    Model -> Model : 数据查询更新
    Model -> Service : 业务逻辑处理
    Controller ->> Service : 业务逻辑处理
    Service --> ClientAPI : 服务请求处理
    ClientAPI --> Service : 服务应答
    Service --> Controller : 业务处理结果
    Controller --> Router : 数据应答
    
  • 如果要实现程序异步机制,请使用Lumen提供的Queue功能。异步机制的使用可以提高API的应答效率,以下场景比如事件机制的接收处理,对于延时的任务机制,也需要通过Queue功能完成

    Router -> Controller :  数据请求
    Controller -> Controller : 处理请求
    Controller --> QueueJob : 任务添加Dispatcher
    Controller --> Router : 数据应答
    QueueJob -> QueueJob : 任务调度
    QueueJob -> JobProcedure : JOB处理
    JobProcedure -> Model : 数据应务处理
    
  • 如果编写与业务无关的类库、服务等应用,需要与上层的Controller/Model解耦,当需要有数据或者事件通知到上层应用,并让上层应用决定做出处理时,那么可以利用Event事件机制。

    Controller -> EventListener : 订阅事件
    MyService -> MyService : 业务处理
    MyService -> Event : 派发事件
    Event --> EventListener : 事件触发
    EventListener -> EventListener : 事件处理
    
  • Controller层的处理只作出正常的返回处理,而不对异常情况进行返回,遇到异常情况时,通过Exception的机制进行数据的返回。

    public function dosth() {
         dosth1();
         dosth2();
         if($error) {
             throw new MYException('Error Message',SOMECODE);
         }
         $this->respond([..]);
    }
    
  • BasicController,BaseModel有UtilToolMethods的相关方法,实现了以下的基本功能

    索引 方法名 备注
    1 arrValidate 实现以数组字典数据的验证
    2 dispatchJob 派发事件
    3 utilToArray 将对象转换为数组
    4 getConfigValue 获得配置文件中的值
    5 arrayEncode 将字典Hash成一个字符串,一般用来实现CacheKey
    6 getEnv 获得环境变量名称: 有dev/testing/production/
    7 envIsTesting 判断环境是否测试环境
    8 envIsDemo 判断环境是否环境
    9 envIsProduction 判断环境是否生产环境

    ?

相关文章

  1. 如何通过xhprof分析性能

    使用方法 xhprof_enable(); /** ... 要检查的php代码 ... **/ $xhprof_data = xhprof_disable(); // 引入xhprof_lib i

  2. LUMEN API Controller 规范

    1. 第三方依赖库规范 在使用LUMEN实现API接口时,以下库必须需要包含在composer包依赖中,以实现代码编写的一些规范 dingo/api : 实现API接口库 vlucas/phpdo

  3. PHP文件锁

    共享锁(LOCK_SH) 什么时候加共享锁? 当在读取数据的时候同时进行着其他的写操作,这个时候需要对文件加共享锁,否则无论有没有对写操作加写锁都会写入成功,导致数据不一致 当文件获得共享锁时,其他

  4. Hello-Risen-程序

    首先需要说明的是,您下载到的文件包含两部分,其中src中是开发源码,用于对Risen框架本身的开发,risen 目录中是通过源码生成的包含debug和release版本的框架程序,用于您应用程序的开发

  5. PHP自定义类示例(Weixin消息解析类)

    PHP自定义类示例(Weixin消息解析类) /** * Created by Qingger. * User: jsspf * Date: 2017/3/24 * Time: 10:50

随机推荐

  1. 如何通过xhprof分析性能

    使用方法 xhprof_enable(); /** ... 要检查的php代码 ... **/ $xhprof_data = xhprof_disable(); // 引入xhprof_lib i

  2. LUMEN API Controller 规范

    1. 第三方依赖库规范 在使用LUMEN实现API接口时,以下库必须需要包含在composer包依赖中,以实现代码编写的一些规范 dingo/api : 实现API接口库 vlucas/phpdo

  3. PHP文件锁

    共享锁(LOCK_SH) 什么时候加共享锁? 当在读取数据的时候同时进行着其他的写操作,这个时候需要对文件加共享锁,否则无论有没有对写操作加写锁都会写入成功,导致数据不一致 当文件获得共享锁时,其他

  4. Hello-Risen-程序

    首先需要说明的是,您下载到的文件包含两部分,其中src中是开发源码,用于对Risen框架本身的开发,risen 目录中是通过源码生成的包含debug和release版本的框架程序,用于您应用程序的开发

  5. PHP自定义类示例(Weixin消息解析类)

    PHP自定义类示例(Weixin消息解析类) /** * Created by Qingger. * User: jsspf * Date: 2017/3/24 * Time: 10:50