tarsisioxavier/magic-object

受 Laravel 模型启发的简单对象

v1.0.1 2024-09-13 00:24 UTC

This package is auto-updated.

Last update: 2024-09-13 00:24:54 UTC


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 功能。