drupal-utils / entity-convert
将Drupal实体对象转换为字段的简单数组。
Requires
- php: ^7.2 || ^8.0
Requires (Dev)
- phpstan/phpstan: ^1.8
- phpunit/phpunit: 9.5.x-dev
This package is auto-updated.
Last update: 2024-09-12 17:39:40 UTC
README
仅用于与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获取
- 从您的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)