drupal-utils/entity-convert

将Drupal实体对象转换为字段的简单数组。

0.0.2-alpha 2022-09-21 15:08 UTC

This package is auto-updated.

Last update: 2024-09-12 17:39:40 UTC


README

Test Cases

Latest Stable Version Total Downloads Latest Unstable Version License

仅用于与Drupal代码库/modules一起使用的PHP库。 解析 并简化传递的Node/Taxonomy/User/File (Drupal实体)完全加载的对象,将其转换为字段的简单数组或可以直接用于构建任何视图或REST响应层的对象。

通常我们实现辅助类/方法来解析给定实体实例的字段值,其背后的思想始终是减少重复代码,并提供一个统一的接口来访问字段值。

每个Drupal实体实例还有一个与之关联的 toArray() 方法,它返回所有字段值作为数组,这也是访问所有值的好方法,但我在使用toArray()方法时发现的一个限制是,所有值都作为字符串返回,因此丢失了它们的原始类型和渲染方式。这个库尝试以单级返回值,并在解析实体对象时接受一个参数,以保持其原始数据类型(当构建REST API时很有用)。

use Drupal\node\Entity\Node;

$node = Node::load(1);
$node->toArray();

我决定编写这个库,以减少每次引入新的实体类型时编写额外辅助类/方法的需求。

安装

使用Composer从Packagist获取

  1. 从您的Drupal项目根目录运行。链接到Packagist
composer require drupal-utils/entity-convert:0.0.1-alpha

用法

考虑具有以下关联默认字段类型的"Node"实体类型

  • 布尔值
  • 整数,小数
  • 整数/小数/文本列表
  • 文件/图像/分类/内容
  • 时间戳/日期
  • 链接,电子邮件

Drupal方法

在代码中通常如何访问字段值。

$node = Node::load(1);
$field_boolean_value = $node->get('field_boolean_value')->value;

// Accessing the values of BaseFields is easy.

$nid = $node->id();
$title = $node->getTitle();
$type = $node->getType();
$isPromoted = $node->isPromoted();

访问与Node实体关联的字段值

布尔值字段

$field_boolean_value = $node->get('field_bool_multi_value')->value;
var_dump($field_boolean_value);
string(1) "1"

日期时间字段

$field_datetime_multi_value = $node->get('field_datetime_multi_value')->value;
var_dump($field_datetime_multi_value);
string(19) "2022-08-31T00:31:28"

日期字段

$field_date_multi_value = $node->get('field_date_multi_value')->value;
var_dump($field_date_multi_value);
array(2) { [0]=> array(1) { ["value"]=> string(10) "2022-08-14" } [1]=> array(1) { ["value"]=> string(10) "2022-08-31" } }

电子邮件字段

$field_email_multi_value = $node->get('field_email_multi_value')->value;
var_dump($field_email_multi_value);
array(2) { [0]=> array(1) { ["value"]=> string(24) "test@abc.com" } [1]=> array(1) { ["value"]=> string(25) "test@def.com" } }

文件字段

$field_file_multi_value = $node->get('field_file_multi_value')->value;
var_dump($field_file_multi_value);
array(1) { [0]=> array(3) { ["target_id"]=> string(1) "3" ["display"]=> string(1) "1" ["description"]=> string(8) "CSV File" } }

文本列表字段

$field_listtext_multi_value = $node->get('field_listtext_multi_value')->getValue();
var_dump($field_listtext_multi_value);
array(2) { [0]=> array(1) { ["value"]=> string(5) "apple" } [1]=> array(1) { ["value"]=> string(4) "ball" } } 

使用库

use Drupal\node\Entity\Node;
// Include the library.
use DrupalUtils\EntityConvert\EntityConvert;
 
// Load instance of node
$node = Node::load(1);
 
// Creating a new Instance.
$entityConvert = new EntityConvert();
 
// Pass on the Node object to get the parsed value as array.
$parsedNode = $entityConvert->toArray($node, false);

获取字段值数组的响应

// Pass on the Node object to get the parsed value as array.
$parsedNode = $entityConvert->toArray($node, false);

var_dump($parsedNode);

^ array:42 [▼
  "nid" => 1
  "uuid" => "8270a03c-a95f-4033-84a7-361597b581a9"
  "vid" => 39
  "langcode" => "en"
  "type" => 0
  "revision_timestamp" => 1660994564
  "revision_uid" => 1
  "revision_log" => null
  "status" => true
  "uid" => 1
  "title" => "Car 1"
  "created" => 1659367826
  "changed" => 1660994564
  "promote" => true
  "sticky" => true
  "default_langcode" => true
  "revision_default" => true
  "revision_translation_affected" => true
  "path" => array:3 [▶]
  "field_bool_multi_value" => array:1 [▼
    0 => true
  ]
  "field_comments_single_value" => array:1 [▶]
  "field_content_multi_value" => array:1 [▶]
  "field_datetime_multi_value" => array:1 [▼
    0 => "2022-08-31T00:31:28"
  ]
  "field_date_multi_value" => array:2 [▼
    0 => "2022-08-14"
    1 => "2022-08-31"
  ]
  "field_email_multi_value" => array:2 [▼
    0 => "testing@abc.com"
    1 => "testing@def.com"
  ]
  "field_file_multi_value" => array:1 [▼
    0 => array:11 [▼
      "fid" => "3"
      "uuid" => "6eb73b6e-be50-449e-a57d-bccf9d6b0bc0"
      "langcode" => "en"
      "uid" => "1"
      "filename" => "testing.csv"
      "uri" => "public://2022-08/testing.csv"
      "filemime" => "text/csv"
      "filesize" => "96"
      "status" => "1"
      "created" => "1660992978"
      "changed" => "1660993028"
    ]
  ]
  "field_image_multi_value" => array:1 [▶]
  "field_link_multi_value" => array:1 [▼
    0 => array:3 [▶]
  ]
  "field_listint_multi_value" => array:1 [▶]
  "field_listtext_multi_value" => array:2 [▶]
  "field_list_multi_value" => array:1 [▶]
  "field_numberfloat_multi_value" => array:1 [▶]
  "field_numberint_multi_value" => array:1 [▶]
  "field_textflws_multi_value" => array:1 [▶]
]

获取对象的响应

如果响应是对象,则可以通过属性访问所有可用字段/值。

// Pass on the Node object to get the parsed value as array.
$parsedNode = $entityConvert->toObject($node, true);

var_dump($parsedNode->nid);
int(1)

var_dump($parsedNode->title);
string(5) "Car 1"

var_dump($parsedNode->field_file_multi_value);
array(1) { [0]=> array(11) { ["fid"]=> string(1) "3" ["uuid"]=> string(36) "6eb73b6e-be50-449e-a57d-bccf9d6b0bc0" ["langcode"]=> string(2) "en" ["uid"]=> string(1) "1" ["filename"]=> string(40) "testing.csv" ["uri"]=> string(57) "public://2022-08/testing.csv" ["filemime"]=> string(8) "text/csv" ["filesize"]=> string(2) "96" ["status"]=> string(1) "1" ["created"]=> string(10) "1660992978" ["changed"]=> string(10) "1660993028" } } 

API

toArray/toObject (实例,strict_type) 方法接受两个参数。

- instance = Loaded instance object of the type Node/User/Taxonomy/File.
- strict_type = Boolean: Returned response has all data types preserved.

当我们从实体关联的字段获取值时,Drupal通常会返回所有值作为字符串。将第二个参数作为true发送,该库将所有值转换为正确的数据类型。

参考

use DrupalUtils\EntityConvert\EntityConvert;

$entityConvert = new EntityConvert();
// $instance == Node/User/Taxonomy/File.
$entityConvert->toArray($instance, true);
$entityConvert->toObject($instance, false);

// The toArray method accepts 2 arguments.

/**
 * Parse the given entity instance and return array.
 *
 * @param Object $instance
 *   The Entity instance to parse.
 * @param Boolean $strict_type
 *   Flag indicating variable types should be preserved.
 *
 * @return array
 */
function toArray($instance, $strict_type = false);

// The toObject method accepts 2 arguments.

/**
 * Parse the given entity instance and return object.
 *
 * @param Object $instance
 *   The Entity instance to parse.
 * @param Boolean $strict_type
 *   Flag indicating variable types should be preserved.
 *
 * @return EntityInterface
 */
function toObject($instance = null, $strict_type = false)