tarsisioxavier / magic-object
受 Laravel 模型启发的简单对象
Requires
- php: ^8.2
Requires (Dev)
- pestphp/pest: ^3.0
- pestphp/pest-plugin-faker: ^3.0
- phpstan/phpstan: ^1.12
README
使用 composer 进行安装。
composer require tarsisioxavier/magic-object
使用方法 ⛏️
DataModel 是一个抽象类,这意味着它不能被实例化。您需要创建另一个类并从它扩展。
<?php require('vendor/autoload.php'); use MagicObject\DataModel; class ExampleClass extends DataModel { // Your code here... } $exampleObject = new ExampleClass(); var_dump($exampleObject);
属性
DataModel 包含一个属性,它持有类中所有属性(除了匹配某些类属性的属性)- 使它们可以像类中存在的属性一样访问。
您可能会注意到对象中的一个“原始”属性,这只是为了持有传递给类构造函数的属性。
当您正在封装来自 API 的数据以记录一些内容并在需要时进行调试时,这非常有用。
<?php require('vendor/autoload.php'); use MagicObject\DataModel; class ExampleClass extends DataModel { // Your code here... } $exampleObject = new ExampleClass(); // This property doesn't exist. $exampleObject->name = 'Dolores Abernathy'; // Will print: Dolores Abernathy. print $exampleObject->name . "\n"; // You can also pass an array when creating the object defining the object's attributes. $anotherExampleObject = new ExampleClass([ 'name' => 'Dolores Abernathy', 'email' => 'dolores.abernathy@hosts.ww' ]); // Will print: Dolores Abernathy (dolores.abernathy@hosts.ww) print $anotherExampleObject->name; print ' '; print '(' . $anotherExampleObject->email . ")\n";
属性访问器
如果您需要修改访问对象属性的方式,您可以在扩展 DataModel 的对象中编写访问器。
以下示例创建了一个具有名称和 CNPJ 的对象。ExampleClass 中的访问器将尝试返回对象的 CPF,因为不存在 CNPJ,所以将返回 CNPJ。
<?php require('vendor/autoload.php'); use MagicObject\DataModel; class ExampleClass extends DataModel { public function getDocumentAttribute() { return $this->cpf ?? $this->cnpj; } } // CPF and CNPJ are types of civilian registers in Brazil. // These were randomly generated in the website: https://www.4devs.com.br/gerador_de_pessoas $exampleObject = new ExampleClass([ 'name' => 'Dolores Abernathy', 'cnpj' => '38.789.452/0001-77', ]); // The object don't have any CPF, so it'll print the CNPJ instead. print $exampleObject->document . "\n";
属性修改器
当您想修改填充对象之前的数据时,您可以为此特定(些)属性编写修改器。
以下示例将接收一个 DateTime 对象,并将其转换为只包含年、月、日、小时和分钟的简单字符串(参数值)。
<?php require('vendor/autoload.php'); use MagicObject\DataModel; class ExampleClass extends DataModel { public function setDateAttribute($value) { $this->attributes['date'] = $value->format('Y-m-d H:i'); } } $datetime = new \DateTime('now'); $object = new ExampleClass(['date' => $datetime]); // Will print only the the year-month-day hour:minute. print $object->date . "\n"; $anotherObject = new ExampleClass(); $anotherObject->date = $datetime; // Same output. print $object->date . "\n";
可启动特质
当您的类从 DataModel
扩展时,您可以运行任何代码。请看下面的示例
<?php require('vendor/autoload.php'); use MagicObject\DataModel; trait SimpleTrait { public string $helloWorld; public function bootSimpleTrait() { $this->helloWorld = 'ZA WARUDO!'; } } class ExampleClass extends DataModel { use SimpleTrait; } $object = new ExampleClass(); echo $object->helloWorld . "\n"; // Output: // ZA WARUDO!
注意,方法必须与特质的名称匹配。
这是完全可选的,如果启动方法未实现,则 DataModel
类将忽略它。
测试 🧪
通过执行 composer test
运行所有测试,如果只想运行特定测试,请尝试: composer test -- --filter <您想运行的测试>
。
Composer 的脚本 'test' 使用 Pest PHP。
您还可以通过使用命令 composer coverage
检查代码覆盖率,这将在 ./.coverage
目录中创建一个 HTML 文件。
还有 PHPStan 的代码质量保证,您可以通过运行 composer phpstan
来检查。
最后但同样重要的是,您可以通过运行 composer test -- --mutate --parallel
使用 Pest Mutation 功能。