hook_entity_presave Drupal 8 模块出现“$entity”参数错误

Drupal 8 module getting "$entity" argument error with hook_entity_presave

我正在尝试在 Drupal 8 (8.9.11) 中创建一个模块,该模块使用函数 hook_entity_presave 以编程方式更新节点/实体。我已经尝试了 https://drupal.stackexchange.com/questions/223346/hook-entity-presave-doesnt-work 的答案,我能够将它们添加到我的代码中。 这是我的 routing.yml (sno.routing.yml):

sno.content:
  path: /node/add/issuances
  defaults:
    _controller: Drupal\sno\Controller\SnoController::sno_entity_presave
  requirements:
    _permission: 'access content'

这是我的控制器 (src/Controller/SnoController.php):

namespace Drupal\sno\Controller;

use Drupal\Core\Entity\EntityInterface;
use Drupal\node\NodeInterface;

class SnoController {
    public function sno_entity_presave(\Drupal\Core\Entity\EntityInterface $entity) {
      if ($entity->getEntityType()->id() == 'issuances') {
     $entity->set('field_s', ', s. ');
    //CAUTION : Do not save here, because it's automatic.
    
    }   
}
}

当我开始添加内容类型发布内容 (/node/add/issuances) 时,出现以下错误:

The website encountered an unexpected error. Please try again later.

RuntimeException: Controller "Drupal\sno\Controller\SnoController::sno_entity_presave()" requires that you provide a value for the "$entity" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one. in Symfony\Component\HttpKernel\Controller\ArgumentResolver->getArguments() (line 78 of /var/www/senate-library/vendor/symfony/http-kernel/Controller/ArgumentResolver.php).

非常感谢!

如果您尝试使用 hook_entity_presave() 挂钩,则应根据他们的设计将其移至 sno.module

$entity 对象将自动解析为 Drupal\Core\Entity\EntityInterface 的实例,这在通过控制器方法执行时不会发生。

<?php

/**
 * @file
 * Contains sno.module.
 */

use Drupal\Core\Entity\EntityInterface;

/**
 * Implements hook_entity_presave().
 */
function sno_entity_presave(EntityInterface $entity) {
  // Do stuff.
}

您可能需要查看 Drupal hooks 以了解其工作原理。

要使用 hook,您不应创建路由,而应在 .module 文件中实现它。 您的钩子函数将在 Drupal 核心进程中自动调用(在您的情况下,它是实体保存流程)。

现在您应该将 sno_entity_presave() 功能移动到 sno.module,然后它会起作用。