lgouttefange / beavor
此包已被废弃,不再维护。未建议替代包。
关于此包的最新版本(v1.4.4)没有可用的许可证信息。
轻量级库,将数组/标准类(通常作为API响应的结果)转换为DTO类
v1.4.4
2018-11-09 16:18 UTC
Requires
- nette/php-generator: ^2.6
- php-di/phpdoc-reader: ^2.1
- symfony/console: >=3.0
Requires (Dev)
- codeception/codeception: <2.4.0
This package is auto-updated.
Last update: 2022-09-28 11:24:22 UTC
README
Beavor
因为他们不想叫我PerCaster
Beavor 是做什么的
这样可以避免这种情况
<?php return [ 'guid' => $cconnectUser['CustomerGuid'], 'civility' => $cconnectUser['Civility'], 'firstname' => $cconnectUser['FirstName'], 'lastname' => $cconnectUser['LastName'], 'maidenname' => !empty($cconnectUser['MaidenName']) ? $cconnectUser['MaidenName'] : null, 'birthdate' => !empty($cconnectUser['Birthdate']) ? $cconnectUser['Birthdate'] : '1970-01-01', 'email' => $cconnectUser['Email'], 'birthDepartment' => isset($cconnectUser['BirthDepartment']) ? $cconnectUser['BirthDepartment'] : null, 'phoneNumber' => !empty($cconnectUser['PhoneNumber']) ? $cconnectUser['PhoneNumber'] : null, 'cellPhoneNumber' => !empty($cconnectUser['MobilePhoneNumber']) ? $cconnectUser['MobilePhoneNumber'] : null, ];
通过将API返回(或任何数组 / stdClass)转换为之前创建的DTO来实现
<?php $cconnectObject = (new \Beavor\Objify)->make(new CconnectUserDto(), $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
优点
- 无需操作数组/对象
- 如果DTO中存在该属性,则其值将被设置
- DTO不会接收额外的属性
- 不再有 undefined index '...' 问题
- API返回值的唯一定义
- 提高清晰度
- 可能的面向对象操作
- 可以使用公共字段或设置器
- 可以与访问器/修改器一起使用
使用
提醒:一个简单的使用示例
<?php $cconnectObject = (new \Beavor\Objify)->make(new CconnectUserDto(), $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
可以静态调用(在TODO中:使用PHPdoc或其他方法处理警告)
<?php $cconnectObject = \Beavor\Objify::make(new CconnectUserDto(), $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
通过传递DTO类的新实例
<?php $cconnectObject = \Beavor\Objify::make(new CconnectUserDto(), $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
或者直接传递类本身(在这种情况下,请确保有可选构造函数)
<?php $cconnectObject = \Beavor\Objify::make( Beavor\Dto\CconnectUserDto::class, $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
通过传递一个数组
<?php $cconnectObject = \Beavor\Objify::make( Beavor\Dto\CconnectUserDto::class, ['someData' => 'someValue']); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
或者一个对象
<?php $cconnectUser = json_decode('<<le JSON>>'); $cconnectObject = \Beavor\Objify::make( Beavor\Dto\CconnectUserDto::class, $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
或者甚至是原始的JSON
或者一个对象
<?php $cconnectObject = (new \Beavor\Objify)->fromRawJson( CconnectUserDto::class, '<<le JSON>>'); $cconnectObject->getGuid(); $cconnectObject->getLastName(); ...
DTO可以包含其他DTO
<?php $cconnectObject = \Beavor\Objify::make( Beavor\Dto\CconnectUserDto::class, $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getAddress(); // instance de CconnectUserAddressDto $cconnectObject->getAddress()->getCity(); ...
如果子DTO在类中未定义,则将得到一个stdClass
<?php $cconnectObject = \Beavor\Objify::make( Beavor\Dto\CconnectUserDto::class, $cconnectUser); $cconnectObject->getGuid(); $cconnectObject->getAddress(); // instance de stdClass $cconnectObject->getAddress()->city; ...
要定义子DTO,请使用有关字段的PhpDoc注释
<?php namespace Helper; class CconnectUserDto { ... /** @var Address */ public $Adress;
它还可以与对象集合一起使用
<?php namespace Helper; class GetUsersDto { ... /** @var User[] */ public $users;
<?php $cconnectObject = (new \Beavor\Objify)->make( GetUsersDto::class, $response); foreach ($users as $user) { // $user est une instance de User $user->getName(); }
DTO
DTO示例
<?php namespace Helper; class DummyClass { use Beavor\Helpers\Arrayable; public $dummyProperty; protected $dummySetterProperty; private $unaccessibleProperty; /** @var DummyClass */ public $nestedProperty; /** * @return mixed */ public function getDummySetterProperty() { return $this->dummySetterProperty; } /** * @param mixed $dummySetterProperty */ public function setDummySetterProperty($dummySetterProperty) { $this->dummySetterProperty = mb_strtoupper($dummySetterProperty); } /** * @return mixed */ public function getUnaccessibleProperty() { return $this->unaccessibleProperty; } }
- 首先使用设置器(例如:dummySetterProperty)
- 但是您也可以定义公共属性而不定义设置器(例如:dummyProperty)
- 如果属性是受保护的且没有设置器,则永远不会修改(例如:unaccessibleProperty)
- 转换时,DTO中不会添加任何属性。它只有它定义的内容
DTO生成
如果您在DTO中有很多字段,或者有很多类,或者两者都有,请使用DTO生成脚本!
php vendor/bin/beavor.php
我们将要求您
- 类名(例如:CniUploadResponseDto)
- 命名空间(例如:\Beavor\Dto)
- 要转换的响应的JSON最小化版本
文件将自动生成在您的目录结构中,自动检测PSR-4根,这样您就无需再触摸任何东西。
默认情况下,所有DTO都使用获取器和公共字段生成。