Unum:简单的实体实现

2.0.1 2015-09-10 15:20 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:53:35 UTC


README

Build Status Latest Stable Version License

安装

使用composer安装此包

$ composer require socialengine/setup-test-db

使用方法

创建一个扩展SocialEngine\Unum\Entity的类,并具有受保护的属性

class MyEntity extends \SocialEngine\Unum\Entity
{
  protected $name;
  protected $email;
}

从那里,可以使用属性数组创建新实体

$entity = new MyEntity(['name' => 'Duke', 'email' => 'support@socialengine.com']);

访问属性

可以使用数组或对象语法访问属性

$entity = new MyEntity(['name' => 'Duke', 'email' => 'support@socialengine.com']);
echo $entity->name; // Duke
echo $entity['email']; // support@socialengine.com

访问尚未“加载”数据的属性将抛出InvalidArgumentException

通过定义形式为get{AttributeName}的方法,实体将使用该方法返回属性值。

注意:snake_case属性将被转换为PascalCase用于方法,因此test_prop变为getTestProp

class GetMethodEntity extends \SocialEngine\Unum\Entity
{
    protected $name;
    
    protected function getName()
    {
        return $name . ' From Method!';
    }
}

$entity = new GetMethodEntity(['name' => 'Hello']);
var_dump($entity->name); // string(18) "Hello From Method!"

分配属性

可以使用数组或对象语法分配属性

$entity = new MyEntity();
$entity->name = 'My Name';
$entity['email'] = 'fake@example.com';
var_dump($entity->toArray());
/*
array(2) {
  'name' =>
  string(4) "Duke"
  'email' =>
  string(24) "support@socialengine.com"
}
*/

分配到不存在的属性将抛出InvalidArgumentException

通过定义形式为set{AttributeName}的方法,实体将使用该方法设置属性值。

注意:snake_case属性将被转换为PascalCase用于方法,因此test_prop变为setTestProp

class SetMethodEntity extends \SocialEngine\Unum\Entity
{
    protected $name;
    
    protected function setName($value)
    {
        $this->name = $name . ' Set By Method!';
    }
}

$entity = new SetMethodEntity(['name' => 'Hello']);
var_dump($entity->name); // string(20) "Hello Set By Method!"

脏属性

如果将实体属性分配的值与其当前值不同,则会将该属性标记为“脏”。要检索实体的脏属性,请将true作为$dirty标志传递给toArray

$entity = new MyEntity();
$entity->name = 'My Name';
var_dump($entity->toArray(true));
/*
array(1) {
  'name' =>
  string(7) "My Name"
}
*/

可以使用clean方法“清理”实体,该方法将从所有属性中删除“脏”标记。

$entity = new MyEntity();
$entity->name = 'My Name';
$entity->email = 'whatever';
$entity->clean();
var_dump($entity->toArray(true));
/*
array(0) {
}
*/

元属性

您可以设置和获取“元”属性 - 即没有直接附加属性的属性。

如果您有一个存储category_id但不存储分类名称的实体,这很好

<?php

require('vendor/autoload.php');

class MyEntity extends \SocialEngine\Unum\Entity
{
  protected $category_id;
  protected $first_name;
  protected $last_name;

  protected function getCategoryName()
  {
    $categoryNamesMap = [
      1 => 'Awesome'
    ];

    return $categoryNamesMap[$this->getProp('category_id')];
  }

  /**
   * You can also set meta properties
   */
  protected function setName($name)
  {
    list($firstName, $lastName) = explode(' ', $name, 2);

    $this->fromArray([
      'first_name' => $firstName,
      'last_name' => $lastName
    ]);
  }
}

$entity = new MyEntity(['category_id' => 1]);
var_dump($entity->categoryName);
/*
string(7) "Awesome"
*/

$entity['name'] = 'Duke Orcino';
var_dump($entity->toArray(true));
/*
array(2) {
  'first_name' =>
  string(4) "Duke"
  'last_name' =>
  string(6) "Orcino"
}
*/

上述实体将允许您通过正常语法访问元属性。使用内置的setPropgetProp,您可以利用Unum提供的某些验证和属性检查代码。

代码风格

请遵循以下指南和代码标准

PHP

Git

附录和说明

  • namespace应与打开php标签在同一行:<?php namespace SocialEngine\Amazing
  • 属性名应使用camelCase
  • 测试名应使用下划线,而不是camelCase。例如:test_cats_love_catnip

许可证

MIT.