业务层(Business)

2020-11-05  by  

架构定义

  1. 书写业务有些人认为一个类就可以了,但实际上不行。我们需要独立的工作区间,才能尽情的运用技术。

  2. 优雅工作的保证,是可以很轻松的调用一切代码资源。

  3. 每个业务应该内部连接,外部独立。这样才可能轻松组合。

  4. 当我们将业务按照目录独立构建,就可以尝试将这部分的代码抽离出来,发布业务组件。

创建目录

  1. src/business目录中创建业务目录,目录名称例如UserBusiness

  2. 在目录中创建类

     namespace App\Business\UserBusiness;
        
        
     use App\Entity\User;
     use PHPZlc\PHPZlc\Bundle\Business\AbstractBusiness;
     use Psr\Container\ContainerInterface;
        
     class UserBusiness extends AbstractBusiness
     {
         public function __construct(ContainerInterface $container)
         {
             parent::__construct($container);
         }
     }
    

    AbstractBusiness是业务层的基础类,其通过继承AbstractController,获得了Controller层中所有的Symfony支持。

  3. 代码规范

src/Business目录下第一级目录必须以Business结尾。

类文件如果是直接操作实体类的的话,命名需为实体名Business,例如UserBusiness

业务方法执行失败,一律返回false

基本用法

<?php
namespace PHPZlc\PHPZlc\Bundle\Business;

use Doctrine\DBAL\Connection;
use Psr\Container\ContainerInterface;
use PHPZlc\PHPZlc\Abnormal\Errors;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Validator\ValidatorInterface;

abstract class AbstractBusiness extends AbstractController
{
    protected $em;

    /**
     * @var Connection
     */
    protected $conn;

    /**
     * @var ValidatorInterface
     */
    private static $validation;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
        $this->em = $this->getDoctrine()->getManager();
        $this->conn = $this->getDoctrine()->getConnection();

        if(empty(self::$validation)){
            self::$validation =  Validation::createValidatorBuilder()
                ->enableAnnotationMapping()
                ->getValidator();
        }
    }

    public function validator($class) : bool
    {
        return Errors::validate(self::$validation, $class);
    }

    /**
     * 网络错误服务
     *
     * @param \Exception $exception
     */
    final protected function networkError(\Exception $exception)
    {
        return Errors::exceptionError($exception);
    }
}

解析

  1. function networkError

    网络错误服务,这个方法在错误收集中也存在。

    在这里强调的原因是,在使用 try catch 语法的时候,不要遗漏该方法的使用。

    这个方法在dev模式下会报出错误,中止程序。但如果是prod模式下则返回false, 将错误信息写入日志(prod.log)中, 呈现在用户面前的信息为系统繁忙,请稍后再试

     try {
            
     }catch (\Exception $exception) {
         $this->networkError($exception);
     } 
    
  2. function validator($class)

    参照数据库插入编辑章节的使用案例。

使用注意

我们不希望这个目录被滥用,过度封装,他应该存放的是逻辑缜密,复杂,复用率高的核心代码。

我们试想了几种他可能被滥用的场景:

  1. 规定Controller只允许接收参数,所有的功能在Business中实现。

  2. 诉求Business和Repository一样和Entity建立一对一的关联关系。

  3. 诉求在Business中集成统一的插入、编辑、删除、验证方法,因为他们是基本的业务且代码重复率高。

  4. 由于Business层提供了书写逻辑的天然理论性和优势性,如果存在可能的话,会将可以复用的代码都塞入到Business中,以希望可以复用。

以上的做法都是盲目恐慌的,好的结构不怕变化。

  1. 过多的封装只是平增无用功。

  2. 程序是人来书写的,符合心理认知的代码才是身心愉悦的。

  3. 好的技术应该是帮助人们减少负担的,好的架构是容许弯路的。

在需要集成的时候在集成,是一种架构底气。

找到错别字了?本文档有什么问题么?分叉并编辑 它 !

CJayhe

谢谢您的赞赏~

使用微信扫描二维码完成支付

抱歉弹框打扰,系统检测到您今日累计浏览时长已达120秒。如果我们的项目对您有帮助,在 关闭窗口之前,希望能够阅读弹框内容,帮助我们变得更好。

一个成功的项目,实现功能只是基础,合理的架构,对资源的调度能力才是灵魂。 PHPZlc, 致力于在Symfony的基础上提供“知行合一”的项目开发方案。

如果您有关切问题和好的想法:

提交

如果您想帮助我们,可以为我们点亮星星,也可以提供资金支持。

您还可以通过以下渠道,关注我们,获取最新的框架动态,帮助项目获取人气,扩大影响力。

开源伙伴招募:https://phpzlc.com/blog/11.html

由于我们无法获取您是否已经是我们的会员了,所以此弹框每日都会弹出一次,关闭