lumen_rule_service.md 2.49 KB

LUMEN+API Service规范

这里的Service其实包含了两层意义,一种表示的是业务逻辑处理(Service)层,一种是表示通用处理(Manager)层。

应用层之间的关系如下:

1. Service规范

  • 在应用中,除了数据操作的业务交给Model实现,额外的业务全部交给Service进行封装实现

  • Service一般实现包括以下几个方面:

    • 封装用户的权限验证
    • 封装一些基本操作,如通过curl实现HttpGet,HttpPost、通过Cache实现CacheManager、通过Log实现LogManager等。
    • 封装了与其它系统交互的细节,如CRMService, PortalService, SCService等。
  • 一般简单的工具类,文件存放在app\Libraray中。

  • 其它具体的提供服务类,文件存放在app\Service中。

  • 通用处理不依赖于上层Controller/Model类,按照约定,通用处理可以在不同项目中复用。

  • 设计服务层时,避免层和层之间互相依赖的关系。一般来说层次结构是 Controller -> Model -> Service,或者Controller -> Service -> Model

  • 在应用中,服务的日志需要独立。

  • 服务被Controller/Model对象所调用,实现业务逻辑,服务一般在这些类中配置成依赖注入的。或者通过Factory方式,生成服务对象。


  /**
   * weixin服务工厂类
   * Class WeixinServiceFactory
   * @package App\Services\WeixinFunc
   */
  class WeixinServiceFactory
  {

      /**
       * @return WeixinMPTicketService
       */
      public function mpTicketService() {
          return App::make(WeixinMPTicketService::class);
      }

      /**
       * @return WeixinMPOpenTPService
       */
      public function mpOpenTpService() {
          return App::make(WeixinMPOpenTPService::class);
      }

      /**
       * @return WeixinQyCorpService
       */
      public function qyCorpService() {
          return App::make(WeixinQyCorpService::class);
      }
  }

  // 在具体实现的Controller中
  public function qyAgentMenuCreate($suiteName) {
      $corpId = $this->requestHandler->input('corpId');
      $this->wxServiceFactory->qyCorpService()->wxQySetAgentMenu(
              $agentInstance->getMyAgentId(),
              $this->getCorpAccessToken($suiteName,$corpId),
              $this->requestHandler->input('menus')
          );
  }
  • 对于依赖注入,有时创建服务时,需要根据Request参数不同,而创建不同的服务实例,那么,可以在bootstrap/app.php中去动态绑定依赖注入时参数的依赖
  /**
   * CorpInstance注入
   */
  $reqCorpId = $request->input($reqCorp);
  $app->bind(\App\Services\CorpInstance::class,function($app) use($reqCorpId){
      if(empty($reqCorpId)) {
          $reqCorpId = 'UNKNOWN_CORP';
      }
      $corpIns = new \App\Services\CorpInstance(reqCorpId);
      return $corpIns;
  });

?