krstijorgji /db-to-php
基于数据库定义生成应用代码的库。
Requires
- php: >=7.1
- symfony/console: >=3.3
- vlucas/phpdotenv: ^5.2
Requires (Dev)
- fzaninotto/faker: ~1.7
- phpunit/phpunit: ^9.5
This package is not auto-updated.
Last update: 2024-10-02 00:19:16 UTC
README
一个用于自动化PHP代码生成以与数据库工作的框架。
很多时候我们需要对应不同数据库表的数据对象类。为了测试和用虚拟数据填充数据库,我们也需要生成那些表的工厂,这些工厂生成虚拟/假数据。
手动完成这些任务花费了很多时间,所以我决定自动化这个过程。这个库不仅创建了实体和工厂,而且还检测并使用原始类型在类和工厂值生成器中。
目前,该库只支持MySQL作为数据库驱动程序。
- 根据您的数据库表创建实体类。
- 创建用于自动生成具有随机数据的实体工厂,或仅生成表的随机数据
- (即将推出) 创建用于写入/读取这些实体的存储库
- (即将推出) 正在努力支持除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文件。