IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Drupal菜鸟笔记之自定义内容实体及踩坑 -> 正文阅读

[PHP知识库]Drupal菜鸟笔记之自定义内容实体及踩坑

因为drupal自带的log系统在项目上线之后不方便使用,于是就想自定义一个简单的日志实体,用于一些关键功能,方便出现问题的时候容易排查跟踪。
因为是自己使用,不需要界面,因此是按照最简单做法。
1、新建一个log模块,创建module_name.info.yml文件,这里的module_name就是模块名称。
在这里插入图片描述
2、创建日志实体:
在模块文件下创建src文件夹,在src文件夹下创建Entity文件夹,然后在Entity下创建实体文件:比如我这里是IxtendCustomLog.php
我这里只是实现了 baseFieldDefinitions 方法,其他的都不需要。

<?php
namespace Drupal\ixtend_log\Entity;

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;

/**
 * @ContentEntityType (
 *   id = "ixtend_custom_log",
 *   label = @Translation("Ixtend Custom Log"),
 *   base_table = "ixtend_custom_log",
 *   entity_keys = {
 *     "id" = "id",
 *     "uuid" = "uuid",
 *   },
 *   handlers = {
 *     "views_data" = "Drupal\views\CustomLogViewsData",
 *   }
 * )
 */
class IxtendCustomLog extends ContentEntityBase implements ContentEntityInterface {

  /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type)
  {
    $fields =  parent::baseFieldDefinitions($entity_type); // TODO: Change the autogenerated stub

    $fields['message'] = BaseFieldDefinition::create('string_long')
      ->setLabel(t("log message"));

    $fields['creator'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Create by'))
      ->setSetting('target_type', 'user')
      ->setDefaultValueCallback(static::class . '::getDefaultEntityCreator');

    $fields['created'] = BaseFieldDefinition::create('created')
      ->setLabel(t('Created'))
      ->setDescription(t('The time of log created'));

    return $fields;
  }

  public static function getDefaultEntityCreator() {
    return \Drupal::currentUser()->id();
  }
}

最简单的实体到这里就够了。在后台的Extend搜索模块名并安装,然后清理缓存,就可以了。这个时候在数据库就可以看到对应的数据表。

踩坑记录:
1、The id field definition does not exist and it is used as id entity key
https://ask.csdn.net/questions/7521830
在安装module的时候出现这个错误,这个折磨了两三天,最后才发现是因为实体的ID和模块的名称重复了。我第一次是直接修改实体ID,然后清缓存,重启站点都没有效果,最后是删掉实体,重新创建实体才生效。
在这里插入图片描述
2、实体安装后,没有数据表,也没报错。
这个也是琢磨很久,参考了别人的代码,发现少了下面这一行代码,就加上试了下,还真就好了。
在这里插入图片描述
3、安装好之后就测试下添加数据。
两种添加方法:

$res = \Drupal::database()->insert('ixtend_custom_log')
      ->fields(['uuid', 'message'], ['6af09a0f','test1'])
      ->execute();

    $obj = IxtendCustomLog::create();
    $obj->set('message', '1233435');
    $obj->save();

第一种除了主键ID会自增,其他的必须代码添加,不会自动生成数据。
第二种像uuid,creator,created都会自动生成数据,不需要指定。
这里在使用第二种方法的时候踩坑了,creator没有数据,最后发现是实体文件里面的问题:

$fields['creator'] = BaseFieldDefinition::create('entity_reference')
      ->setLabel(t('Create by'))
      ->setSetting('target_type', 'user')
      ->setDefaultValueCallback(static::class . '::getDefaultEntityCreator');

这段代码中,setDefaultValueCallback(static::class . ‘::getDefaultEntityCreator’)括号内的参数是使用的 . 链接,而我最开始没看清楚,以为是两个参数,所以用的 , 分隔,所以无法设置默认值。

好了,以上就是自定义实体的尝试以及踩坑分享,大佬勿喷,有错欢迎大佬指正,谢谢!

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:18:30  更:2021-10-11 17:19:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 13:34:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计