此包已被废弃,不再维护。未建议替代包。
关于此包的最新版本(v1.4.4)没有可用的许可证信息。

轻量级库,将数组/标准类(通常作为API响应的结果)转换为DTO类

v1.4.4 2018-11-09 16:18 UTC

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;
    }
}
  1. 首先使用设置器(例如:dummySetterProperty)
  2. 但是您也可以定义公共属性而不定义设置器(例如:dummyProperty)
  3. 如果属性是受保护的且没有设置器,则永远不会修改(例如:unaccessibleProperty)
  4. 转换时,DTO中不会添加任何属性。它只有它定义的内容

DTO生成

如果您在DTO中有很多字段,或者有很多类,或者两者都有,请使用DTO生成脚本!

php vendor/bin/beavor.php

我们将要求您

  1. 类名(例如:CniUploadResponseDto)
  2. 命名空间(例如:\Beavor\Dto)
  3. 要转换的响应的JSON最小化版本

文件将自动生成在您的目录结构中,自动检测PSR-4根,这样您就无需再触摸任何东西。

默认情况下,所有DTO都使用获取器和公共字段生成。