86.实体类型知识库entity_type.repository

实体类型知识库entity_type.repository

该服务为实体类型操作提供辅助方法,这些方法不适合划归到其他组件中,服务定义如下:

服务identity_type.repository

类:\Drupal\Core\Entity\EntityTypeRepository

接口:\Drupal\Core\Entity\EntityTypeRepositoryInterface

获取方法:$entity_type_repository = \Drupal::service('entity_type.repository');

 

目前提供了两个辅助方法:

public function getEntityTypeLabels($group = FALSE)

返回系统中全部实体的label,通常用于向相关表单下拉选择框提供选项值,默认返回一个数组,键名是实体类型id,键值为翻译对象表示的label,如果参数$group设置为true,那么第一级键名为分组名,默认只有内容和配置两个组(在释文对象中有补充组信息),第二级键名为实体类型id,键值为翻译对象表示的label,可以在控制器中运行以下代码:

        $group_labels = \Drupal::service('entity_type.repository')->getEntityTypeLabels(true);
        foreach ($group_labels as $group => &$labels) {
            foreach ($labels as &$label) {
                $label = (string)$label;
            }
        }
        print_r($group_labels);
        die;

将输出以下内容:


Array
(
    [内容] => Array
        (
            [node] => 内容
            [taxonomy_term] => 分类术语
            [menu_link_content] => 定制菜单链接
            [shortcut] => 快捷方式链接
            [file] => 文件
            [user] => 用户
            [contact_message] => 联系信息
            [block_content] => 自定义区块
            [comment] => 评论
        )

    [配置] => Array
        (
            [rdf_mapping] => RDF mapping
            [node_type] => 内容类型
            [language_content_settings] => 内容语言设置
            [taxonomy_vocabulary] => 分类词汇表
            [action] => 动作
            [block] => 区块
            [image_style] => 图像样式
            [base_field_override] => 基字段覆盖
            [field_config] => 字段
            [field_storage_config] => 字段存储
            [entity_form_display] => 实体表单显示
            [entity_view_display] => 实体视图显示
            [shortcut_set] => 快捷方式组
            [search_page] => 搜索页面
            [filter_format] => 文本格式
            [editor] => 文本编辑器
            [date_format] => 日期格式
            [entity_view_mode] => 查看模式
            [tour] => 界面导览
            [contact_form] => 联络表单
            [block_content_type] => 自定义区块类型
            [menu] => 菜单
            [entity_form_mode] => 表单模式
            [view] => 视图
            [user_role] => 角色
            [comment_type] => 评论类型
            [configurable_language] => 语言
        )

)

 

public function getEntityTypeFromClass($class_name):
根据实体类的类名找到实体类型id,在直接使用实体类的以下这些静态方法时:
load($id)、loadMultiple(array $ids = NULL)、create(array $values = [])
并未提供实体类型id,但这是取得实体储存器的关键,此时可以用该辅助方法通过实体类的类名推断出实体类型id,传入的参数应该是全限定类名,如:
“Drupal\yunke_help\Controller\Test”
不带前后“\”,这通常由php函数get_called_class()提供
在内部将提供的类名和实体类型管理器中取得的实体类型定义中的类名逐一对比,注意其使用“==”而不是instanceof运算符或is_subclass_of函数,因为在这种子类情况时,定义中应该是已经被修改过
如果同一个类被推断出多个实体类型id,将抛出异常,没有找到也会抛出异常

clearCachedDefinitions():
清除内部静态缓存,已弃用,在D9时移除

本书共161小节。


目前全部收费内容共295.00元。购买全部

评论 (2)

  • 29
    • 2023-03-20

    load($id)、loadMultiple(array $ids = NULL)、create(array $values = [])
    并未提供实体类型id,但这是取得实体储存器的关键,此时可以用该辅助方法通过实体类的类名推断出实体类型id,传入的参数应该是全限定类名,如:
    “Drupal\yunke_help\Controller\Test”
    不带前后“\”,这通常由php函数get_called_class()提供

    不太清楚为啥不能先说完这个类的传参 再去讲实体的用法 感觉表达顺序有交叉 看着有点费劲了

  • 这几个方法不需要传递实体类型ID,他们本身就是挂载到实体储存器上面的方法,在实体类中,只是起到一个代理作用