yjyer/php-dto

php dto realization

v1.0.6 2022-12-28 12:02 UTC

This package is auto-updated.

Last update: 2025-04-07 16:54:58 UTC


README

运行环境要求PHP8.0或以上

主要新特性

  • 支持类似Java DTO

安装

安装

composer require yjyer/php-dto

卸载

composer remove yjyer/php-dto

使用方法

在thinkphp6框架文件:/vendor/topthink/framework/src/think/Container.php 里的方法:invokeReflectMethod 下增加如下代码,如:

/**
    * dto模块运行入口
    * 1、此代码需要手动增加
    * 2、每次更新tp核心框架后,如果此方法(Container/invokeReflectMethod)没有此代码,则需要增加
    */
$args = \yjyer\phpdto\Main::actionInject($reflect, $args, $vars);

完整方法如:

/**
     * 调用反射执行类的方法 支持参数绑定
     * @access public
     * @param object $instance 对象实例
     * @param mixed  $reflect  反射类
     * @param array  $vars     参数
     * @return mixed
     */
public function invokeReflectMethod($instance, $reflect, array $vars = [])
{
    $args = $this->bindParams($reflect, $vars);

    /**
        * dto模块运行入口
        * 1、此代码需要手动增加
        * 2、每次更新tp核心框架后,如果此方法(Container/invokeReflectMethod)没有此代码,则需要增加
        */
    $args = \yjyer\phpdto\Main::actionInject($reflect, $args, $vars);

    return $reflect->invokeArgs($instance, $args);
}

dto类配置

<?php

declare(strict_types=1);

namespace app\account\dto;

use yjyer\phpdto\attribute\{IsDto, Validate, Field};

/**
 * 验证类
 */
#[IsDto(dto: 1)]
class UserDto
{
    #[Validate(v: 'require|max:3')]
    #[Field(title: "姓名", default: "张三")]
    public string $name;

    #[Validate(v: 'require|number|between:1,120', between: '有自定义则显示自定义提示:年龄不要输入太多或太小啊')]
    #[Field(title: "年龄", default: "")]
    public int $age;

    #[Validate(v: 'number|between:1,100')]
    #[Field(title: "位置", default: "1")]
    public int $position;

    #[Validate(v: 'email|require|max:3')]
    #[Field(title: "邮箱", default: "")]
    public string $email;
}

Validate的验证规则,和thinkphp6是一样的用法,查看:https://www.kancloud.cn/manual/thinkphp6_0/1037625

控制器内的使用

<?php

declare(strict_types=1);

namespace app\account\controller;

use app\account\dto\UserDto;
use yjyer\phpdto\attribute\ParamDto;

class Index
{

    /**
     *
     * 用户信息方法
     *  
     */
    #[ParamDto(field: "age", title: "年龄", default: "18", v: 'number|between:1,120')]
    public function user(UserDto $userDto)
    {
        //1、输出已经注入UserDto内的参数
        //2、这里能拿到的数据,都是通过了验证的数据
        //3、如果ParamDto里有和Dto类(如UserDto)类里相同的字段,则优先使用ParamDto的配置
        dd($userDto);
        return '您好!这是一个[account]示例应用,请参考';
    }
}