PHP中编码分层和编码规范

controller层

  1. 接收并验证参数的基本类型正确性和参数的必须性。
  2. 调用service层。
  3. 返回响应。

model层(dao层)

  1. 访问数据库。

service层

  1. 处理具体业务逻辑。
  2. 调用model层。
  3. 返回结果。
  4. 需灵活的解耦不能彼此调用。
    可参考:PHP中service层怎么设计兼顾优雅和方便?
// 对于参数很多的方法,可以用对象表示参数,控制器根据Request封装得到对象(对象也可以提供一个fromRequest方法)再传给Service。

// 补充个例子,UserService的getList可以这样定义:
// 例子,UserService的getList可以这样定义:
public function getList(UserCriteria criteria, $limit = 10, $offset = 0) {
  ...
}

// 看函数签名就可以知道第一个参数是UserCriteria,后面的$limit和$offset是分页用的,也可以再封装成一个类,但是没必要。

// 其中的UserCriteria就是查找和筛选用户的条件:

class UserCriteria
{
    public $name;
     
    public $age;
    
    // ... 很多其他参数
    
    
    public static function fromRequest(Request $req)
    {
        $instance = new static;
        $instance->name = $req->input('name');
        // ... 很多其他参数
        return $instance;
    }
}

// 在控制器调用:
public function index(Request $req)
{
    $criteria = UserCriteria::fromRequest($req);
    $userList = $this->userService->getList($criteria, 10);
    // ...
}

lib区

在service层建一个依赖区lib。将serviceA依赖serviceB的公共方法提出来,建个类(或Trait)完成解耦。

开发思路

  1. 先使用最简单的m + c。(那业务逻辑将往c层放)
  2. 遇到或预判到重复逻辑,则提取到service层。

一般目录结构

丨-Controller
丨-Model
丨-Service
丨--Lib

编码规范注意

编码规范采用国际通用的PSR-1

  1. 常量必须全部大写,词间以下划线分隔,即CONSTANT_XXX;
  2. 类和命名空间遵循大写开头的驼峰命名规范,即ClassA;
  3. 类的属性遵循下划线分隔式,即$m_user;
  4. 类的方法遵循小写开头驼峰命名,即userLogin();

使用环境变量时,尽量用 HTTP_HOST,而不是 SERVER_NAME。参考

判断文件是否存在,用 if_file;判断目录是否存在,用 if_dir;尽量不要用 file_exists,因为慢。参考

关于Git提交

参考:一个维护版本日志整洁的Git提交规范

posted @ 2020-10-07 06:25  xiao_linxin  阅读(157)  评论(0)    收藏  举报