模块布局

项目中如果涉及多个模块,可以将其独立出来。然后每个模块中图上相关的布局。这样子做的好处是要
将项目独立出来搞微服务时,模块与模块之间的耦合度会降低。如果是模块与模块之间存在调用关系,我们
也可以再创建一个 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 {
public $name;
public $password; }
|
DTO
基础类实现了 set
, get
的 __call
调用,这样就可以把繁琐的属性函数定义去掉,按照一定的规则
我们也能很直观的知道哪些参数进行赋值的操作。而且 TestDTO
类把使用到的属性全部定义出来,再加上注释,瞬间
代码的清晰度高了许多。过了半年在看这段代码你也会清楚实现了什么功能。
然后这里为什么会使用 testLogic->toDTO
进行获取呢?这里主要考虑的是逻辑复用,一个场景的 DTO
实体,不可能
只应用在一个场景,为了通用性考虑,由具体的逻辑层去实现。
类命名规则
interface
命名为 xxxContract
- 继承继承基类命名为
xxxBase
异常类与多语言结合
抛异常行为通常会存在着常用的错误信息,这里面涉及到国际化的问题。怎么将国际化落地是一个问题,为了更加的优雅,所以这里面直接绑定异常类。

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