alexboo/phalcon-annotation-mapper

通过注解映射数据

dev-master 2018-01-26 03:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:47:37 UTC


README

从对象或关联数组映射数据到实现 \Alexboo\AnnotationMapper\MapperInterface 的对象

安装

您可以使用 composer 安装它。但是它需要 phalcon 框架 php 扩展。

composer require alexboo/phalcon-annotation-mapper

示例

class Example extends \Alexboo\AnnotationMapper\Mapper
{
    /**
     * @Mapped(property="priceOut", type="float", precision=2)
     */
    public $price;

    /**
     * @Mapped(type="integer")
     */
    protected $count;

    /**
     * @Mapped(type="float[]")
     */
    public $array;

    /**
     * @Mapped(type="Example2[]")
     */
    public $object;

    public function setCount($value) {
        $this->count = $value;
    }
}

class Example2 extends \Alexboo\AnnotationMapper\Mapper
{
    /**
     * @Mapped(type="integer")
     */
    public $propertyOne;

    /**
     * @Mapped(type="float")
     */
    public $propertyTwo;

    /**
     * @Mapped(type="string")
     */
    public $propertyThree;
}

$donator = [
    'priceOut' => '1000.51000',
    'count' => 100,
    'array' => ['1.222','2.333','3.400000'],
    'object' => [[
        'propertyOne' => '1000.500',
        'propertyTwo' => '2000.500',
        'propertyThree' => ' aaaddd '
    ]]
];

$example = new Example();

$example->mapping($donator);


var_dump($example);

$donator = new stdClass();
$donator->priceOut = '2000.52000';
$donator->count = 200;
$donator->array = [4,5,6];
$donator->object = [[
    'propertyOne' => '1000.520',
    'propertyTwo' => '2000.520',
    'propertyThree' => ' aaaddd '
]];



$example = new Example();

$example->mapping($donator);

var_dump($example);

附加选项。

Caster float 和 string 支持附加选项。对于 float caster,您可以为小数点后的位数设置精度。对于字符串,您可以禁用或启用(默认使用)修剪所有字符串。

 // Set default precision for all properties with float type
 
 \Alexboo\AnnotationMapper\Cast\Float::setDefaultPrecision(1);
 
 class Example3 extends \Alexboo\AnnotationMapper\Mapper
 {
     /**
      * @var float $field1
      * @Mapped(type="float")
      */
     public $field1;
     /**
      * @var float $field2
      * @Mapped(type="float")
      */
     public $field2;
 }
 
 $example = new Example3();
 $example->mapping([
     'field1' => '15.123456',
     'field2' => '987.654123',
 ]);
 
 var_dump($example);
 
 // Disabled/enabled trim string data
 
 class Example4 extends \Alexboo\AnnotationMapper\Mapper
 {
     /**
      * @Mapped(type="string")
      */
     public $field1;
     /**
      * @Mapped(type="string")
      */
     public $field2;
 }
 
 \Alexboo\AnnotationMapper\Cast\String::isTrim(false);
 
 $example = new Example4();
 $example->mapping([
     'field1' => '   asdasd  asdasdasd   ',
     'field2' => '        ',
 ]);
 
 var_dump($example);
 
 \Alexboo\AnnotationMapper\Cast\String::isTrim(true);
 
 $example = new Example4();
 $example->mapping([
     'field1' => '   asdasd  asdasdasd   ',
     'field2' => '        ',
 ]);
 
 var_dump($example);
 

创建您的自定义类

如果您需要,可以创建自定义类。然后,您可以指定它作为属性的类型。Caster 必须实现 \Alexboo\AnnotationMapper\CastCastInterface

/**
 * Cast all data to "blabla" string
 * Class BlaBlaCaster
 */
class BlaBlaCaster extends \Alexboo\AnnotationMapper\Cast\CastAbstract
{
    public function cast($value) {
        return "blabla";
    }
}

class Example5 extends \Alexboo\AnnotationMapper\Mapper
{
    /**
     * @Mapped(type="BlaBlaCaster")
     */
    public $field1;
    /**
     * @Mapped(type="\Alexboo\AnnotationMapper\Cast\Integer")
     */
    public $field2;
}

$example = new Example5();
$example->mapping([
    'field1' => 'Say something very clever!',
    'field2' => 123213213,
]);

var_dump($example);