现在在业务开发的场景中遇到一个问题,PHP 很多情况下的参数都是数组形式的,比如从前端传过来的 JSON ,这样在向后传递使用的时候,我们不能明确的之后数组里有什么内容,或者需要借助注解的方式来声明参数。在多人配合开发的时候问题更大,所以现在就想把参数特别是从外部接受的参数都固定下来,转换成为预定义类的对象。想咨询一下大家有没有相关的事件,遇没遇到什么坑。
1
zpfhbyx 2022-03-01 12:28:05 +08:00
Protobuf
|
2
aababc OP @zpfhbyx 现在的方案都是 JSON 的,迁移到 Protobuf 的成本太高了,需要前后端联动。而且短期来看,也不回使用 Protobuf 所以就想在后端处理。
|
3
Rache1 2022-03-01 13:32:43 +08:00
你可能需要这个?
spatie/data-transfer-object - Packagist https://packagist.org/packages/spatie/data-transfer-object |
4
james122333 2022-03-01 14:21:29 +08:00
你可以写一个基本数组与进来的资料进行结构比对 这样的好处是不用用反射
转成对象需要反射 用法和 java 差不多 效能有些许的影响 |
5
meshell 2022-03-02 09:34:26 +08:00
你要不试试这个插件,deep-assoc-completion 虽然也是标注的。
|
7
HappyStraw 2022-03-02 13:49:54 +08:00
我是做一个简单的参数转换:
1. 基类(如: PropertyAccess); 2. 实现 \JsonSerializable, \ArrayAccess 接口 3. 实现了魔术方法__call, 完成 getter 和 setter, 里面可以对属性名字转换, 驼峰和下划线互相转换 4. 参数选项默认 protected 5. 提供静态方法 from(array $data)从 JSON 中初始化(默认赋值, 如子参数是 PropertyAccess 子类, 在里面初始化), 也可以在__construct 实现 6. 提供 toArray(如子参数是 PropertyAccess 子类那就里面 toArray) 大致的效果 /** * Class User * * @method int getId() * @method string getName() * @method void setId(int $id) * @method void setName(string $name) */ class User extends PropertyAccess { protected $id; protected $name; } $user = User::from(['id' => 1, 'name' => 'xiaoming']); echo $user->getName(); echo $user->getId(); echo json_encode($user); |
8
aababc OP @HappyStraw 看起来挺好的,现在也有比较完善的解决方案,还在权衡利弊!
|