模块布局

项目中如果涉及多个模块,可以将其独立出来。然后每个模块中图上相关的布局。这样子做的好处是要
将项目独立出来搞微服务时,模块与模块之间的耦合度会降低。如果是模块与模块之间存在调用关系,我们
也可以再创建一个 forModule 文件夹,里面编写给其它模块调用的类,其它问题也可以类推。

DTO 的使用

现在很多框架其实都有 request 请求实体对象来统一管理请求参数,但是在很多的代码编写中,可能会出现以下的
代码

1
2
3
4
5
6
7
8
9
10
11
class TestController
{
public function test(Request $request)
{
$a = $request->input('a');
$b = $request->input('b');
$c = $request->input('c');
(new TestLogic())->doSomethink($a, $b, $c);
}
}

当参数过多时,函数看起来就非常难看,而且参数满天飞,管理起来也会增加心智负担。所以这里后我们需要把参数全部聚合
一起进行管理,然后 DTO 就该出场了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class TestController
{
public function test(Request $request)
{
$a = $request->input('a');
$b = $request->input('b');
$c = $request->input('c');
(new TestLogic())->doSomethink($a, $b, $c);
}

public function testDTO(Request $request)
{
$params = $request->input();
$testLogic = (new TestLogic());
$dto = $testLogic->toDTO($params);
$testLogic->doSomethink2($dto);
}
}

class TestLogic
{
public function toDTO($params)
{
return (new TestDTO())
->setName($params['name'] ?? '')
->setPassword($params['password'] ?? '');
}

public function doSomethink($a, $b, $c)
{

}

public function doSomethink2(TestDTO $dto)
{
$dto->getName();
$dto->getPassword();
}
}

class TestDTO extends DTO
{
/**
* 用户姓名
* @var $name string
*/
public $name;

/**
* 用户密码
* @var $password string
*/
public $password;
}

DTO 基础类实现了 set , get__call 调用,这样就可以把繁琐的属性函数定义去掉,按照一定的规则
我们也能很直观的知道哪些参数进行赋值的操作。而且 TestDTO 类把使用到的属性全部定义出来,再加上注释,瞬间
代码的清晰度高了许多。过了半年在看这段代码你也会清楚实现了什么功能。

然后这里为什么会使用 testLogic->toDTO 进行获取呢?这里主要考虑的是逻辑复用,一个场景的 DTO 实体,不可能
只应用在一个场景,为了通用性考虑,由具体的逻辑层去实现。

类命名规则

  1. interface 命名为 xxxContract
  2. 继承继承基类命名为 xxxBase

异常类与多语言结合

抛异常行为通常会存在着常用的错误信息,这里面涉及到国际化的问题。怎么将国际化落地是一个问题,为了更加的优雅,所以这里面直接绑定异常类。

基类的构造函数里面会根据是否能找到相关的映射文本进行输出