krstijorgji/db-to-php

基于数据库定义生成应用代码的库。

v1.0.4 2022-08-23 14:19 UTC

This package is not auto-updated.

Last update: 2024-10-02 00:19:16 UTC


README

一个用于自动化PHP代码生成以与数据库工作的框架。

很多时候我们需要对应不同数据库表的数据对象类。为了测试和用虚拟数据填充数据库,我们也需要生成那些表的工厂,这些工厂生成虚拟/假数据。

手动完成这些任务花费了很多时间,所以我决定自动化这个过程。这个库不仅创建了实体和工厂,而且还检测并使用原始类型在类和工厂值生成器中。

目前,该库只支持MySQL作为数据库驱动程序。

  1. 根据您的数据库表创建实体类。
  2. 创建用于自动生成具有随机数据的实体工厂,或仅生成表的随机数据
  3. (即将推出) 创建用于写入/读取这些实体的存储库
  4. (即将推出) 正在努力支持除MySQL之外的其他数据库驱动程序

目录

安装

composer require kristijorgji/db-to-php

运行以下命令以初始化dbToPhp

vendor/bin/dbToPhp init

此命令将在您的项目根目录中创建配置文件dbToPhp.cfg.php。您需要编辑它以设置所需设置。

配置

配置和其密钥尽可能具有自解释性。示例配置

<?php

return [
    'typeHint' => true,
    'databaseDriver' => 'mysql',
    'connection' => [
        'host' => '127.0.0.1',
        'port' => 3306,
        'database' => 'db_to_php',
        'username' => 'root',
        'password' => 'Test123@',
    ],
    'entities' => [
        'includeTables' => ['*'],
        'tableToEntityClassName' => [
            'test' => 'SuperEntity'
        ],
        'outputDirectory' => 'Entities',
        'namespace' => 'Entities',
        'includeAnnotations' => true,
        'typeHintProperties' => false,
        'includeSetters' => true,
        'includeGetters' => true,
        'fluentSetters' => true,
        'properties' => [
            'accessModifier' => \kristijorgji\DbToPhp\Rules\Php\PhpAccessModifiers::PRIVATE
        ]
    ],
    'factories' => [
        'includeTables' => ['*'],
        'tableToEntityFactoryClassName' => [
            'test' => 'SuperEntityFactory'
        ],
        'outputDirectory' => 'Factories/Entities',
        'namespace' => 'Factories\Entities',
        'includeAnnotations' => true
    ]
];

您必须设置正确的数据库凭据和驱动程序(目前只支持MySQL)。

typehint - 如果设置为true,则生成的PHP代码将在函数参数和返回类型中使用类型提示(PHP 7 /7.1)

使用typehint=true的示例

/**
 * @param array $data
 * @return TestEntity
 */
public static function make(array $data = []): TestEntity
{
    return self::makeFromData(self::makeData($data));
}

使用typehint=false的示例

/**
 * @param array $data
 * @return TestEntity
 */
public static function make()
{
    return self::makeFromData(self::makeData($data));
}

用法

生成实体

功能

  • 检测数据库字段类型并使用相应的PHP类型来表示属性
  • 检测数据库字段是否为可空,并生成相应的属性和方法
  • (可选) 您可以为特定的表选择自定义实体类名
  • 您可以生成所有表的实体,或仅生成您指定的表的实体
  • 您可以根据您设置的配置使用或不用注释(PHPDoc)
  • 您可以配置实体属性的访问修饰符
  • 您可以配置是否生成setter方法以及是否生成流畅的setter方法
  • 您可以配置是否生成getter方法
  • 您可以配置是否生成类型提示的getter/setter

生成实体说明

首先,请确保在安装后生成的配置文件dbToPhp.cfg.php中正确设置了数据库连接和凭据。

如果希望生成的代码适用于支持类型提示和返回类型(如?string)的PHP,请将typeHint键设置为true。

其他选项是自解释的。在配置文件中的entities键下更改任何您喜欢的内容。

下面仅显示了实体生成配置的部分,您可以在配置部分中查看完整的配置示例。

[
    'entities' => [
        'includeTables' => ['*'],
        'tableToEntityClassName' => [
            'test' => 'SuperEntity'
        ],
        'outputDirectory' => 'Entities',
        'namespace' => 'Entities',
        'includeAnnotations' => true,
        'typeHintProperties' => false,
        'includeSetters' => true,
        'includeGetters' => true,
        'fluentSetters' => true,
        'properties' => [
            'accessModifier' => \kristijorgji\DbToPhp\Rules\Php\PhpAccessModifiers::PRIVATE
        ]
    ]
]

然后只需从您的终端运行

vendor/bin/dbToPhp generate:entities

示例实体生成

在我的演示设置中,我只选择了以下MySQL架构的表格

CREATE TABLE users_demo
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    surname VARCHAR(20) NOT NULL,
    preferences JSON,
    birth_year YEAR(4) NOT NULL,
    nr_cars TINYINT(3) unsigned NOT NULL,
    salary DECIMAL(18,4) NOT NULL,
    active TINYINT(1) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

生成的实体类如下(请注意,类名、命名空间、注解的使用、类型提示、设置器/获取器等都可以在配置文件中自定义)

<?php

namespace Entities;

class UsersDemoEntity
{
    /**
     * @var int
     */
    private $id;

    /**
     * @var string
     */
    private $name;

    /**
     * @var string
     */
    private $surname;

    /**
     * @var string|null
     */
    private $preferences;

    /**
     * @var int
     */
    private $birthYear;

    /**
     * @var int
     */
    private $nrCars;

    /**
     * @var float
     */
    private $salary;

    /**
     * @var bool
     */
    private $active;

    /**
     * @var string
     */
    private $createdAt;

    /**
     * @param int $id
     * @return $this
     */
    public function setId(int $id)
    {
        $this->id = $id;
        return $this;
    }

    /**
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * @param string $name
     * @return $this
     */
    public function setName(string $name)
    {
        $this->name = $name;
        return $this;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $surname
     * @return $this
     */
    public function setSurname(string $surname)
    {
        $this->surname = $surname;
        return $this;
    }

    /**
     * @return string
     */
    public function getSurname(): string
    {
        return $this->surname;
    }

    /**
     * @param string|null $preferences
     * @return $this
     */
    public function setPreferences(?string $preferences)
    {
        $this->preferences = $preferences;
        return $this;
    }

    /**
     * @return string|null
     */
    public function getPreferences(): ?string
    {
        return $this->preferences;
    }

    /**
     * @param int $birthYear
     * @return $this
     */
    public function setBirthYear(int $birthYear)
    {
        $this->birthYear = $birthYear;
        return $this;
    }

    /**
     * @return int
     */
    public function getBirthYear(): int
    {
        return $this->birthYear;
    }

    /**
     * @param int $nrCars
     * @return $this
     */
    public function setNrCars(int $nrCars)
    {
        $this->nrCars = $nrCars;
        return $this;
    }

    /**
     * @return int
     */
    public function getNrCars(): int
    {
        return $this->nrCars;
    }

    /**
     * @param float $salary
     * @return $this
     */
    public function setSalary(float $salary)
    {
        $this->salary = $salary;
        return $this;
    }

    /**
     * @return float
     */
    public function getSalary(): float
    {
        return $this->salary;
    }

    /**
     * @param bool $active
     * @return $this
     */
    public function setActive(bool $active)
    {
        $this->active = $active;
        return $this;
    }

    /**
     * @return bool
     */
    public function getActive(): bool
    {
        return $this->active;
    }

    /**
     * @param string $createdAt
     * @return $this
     */
    public function setCreatedAt(string $createdAt)
    {
        $this->createdAt = $createdAt;
        return $this;
    }

    /**
     * @return string
     */
    public function getCreatedAt(): string
    {
        return $this->createdAt;
    }
}

https://github.com/kristijorgji/db-to-php/blob/master/docs/samples/entities/UsersDemoEntity.php

实体类的名称为UsersDemoEntity,但可以在配置部分 'entities'['tableToEntityClassName'] 中自定义

生成工厂

功能

  • 检测枚举并生成允许的值
  • 检测整数是有符号还是无符号及其范围
  • 检测浮点数/双精度数/小数的精度并生成达到该最大精度的值
  • 检测JSON字段并生成有效的JSON
  • 检测日期和年份并生成适当的值
  • 检测字段是否可以为空

(请参阅示例执行以进行演示)

生成工厂说明

工厂的配置部分与实体类似,易于理解

'factories' => [
        'includeTables' => ['*'],
        'tableToEntityFactoryClassName' => [
            'test' => 'SuperEntityFactory'
        ],
        'outputDirectory' => 'Factories/Entities',
        'namespace' => 'Factories\Entities',
        'includeAnnotations' => true
    ]

配置该部分以符合您的喜好后,执行以下操作以生成工厂

vendor/bin/dbToPhp generate:factories

示例工厂生成

我将使用与生成实体相同的表格作为示例。

CREATE TABLE users_demo
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    surname VARCHAR(20) NOT NULL,
    preferences JSON,
    birth_year YEAR(4) NOT NULL,
    nr_cars TINYINT(3) unsigned NOT NULL,
    salary DECIMAL(18,4) NOT NULL,
    active TINYINT(1) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

以下给出结果工厂。如您所见,每个生成数据都根据表格规范进行了详细说明。

<?php

namespace Factories\Entities;

use Entities\UsersDemoEntity;

class UsersDemoEntityFactory extends AbstractEntityFactory
{
    /**
     * @param array $data
     * @return UsersDemoEntity
     */
    public static function make(array $data = []): UsersDemoEntity
    {
        return self::makeFromData(self::makeData($data));
    }
   
    /**
     * @param array $data
     * @return UsersDemoEntity
     */
    public static function makeFromData(array $data): UsersDemoEntity
    {
        return self::mapArrayToEntity($data, UsersDemoEntity::class);
    }
 
    /**
     * @param array $data
     * @return array
     */
    public static function makeData(array $data = []): array
    {
        return [
            'id' => $data['id'] ?? self::randomInt64(),
            'name' => $data['name'] ?? self::randomString(rand(0, 20)),
            'surname' => $data['surname'] ?? self::randomString(rand(0, 20)),
            'preferences' => $data['preferences'] ?? self::randomJson(),
            'birth_year' => $data['birth_year'] ?? self::randomYear(4),
            'nr_cars' => $data['nr_cars'] ?? self::randomUnsignedInt8(),
            'salary' => $data['salary'] ?? self::randomFloat(4),
            'active' => $data['active'] ?? self::randomBoolean(),
            'created_at' => $data['created_at'] ?? self::randomDate('Y-m-d H:i:s'),
        ];
    }
}

许可证

db-to-php采用MIT许可发布。有关详细信息,请参阅附带LICENSE文件。