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



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

sno.content:
path: /node/add/issuances
defaults:
_controller: DrupalsnoControllerSnoController::sno_entity_presave
requirements:
_permission: 'access content'

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

namespace DrupalsnoController;
use DrupalCoreEntityEntityInterface;
use DrupalnodeNodeInterface;
class SnoController {
public function sno_entity_presave(DrupalCoreEntityEntityInterface $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 "DrupalsnoControllerSnoController::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 SymfonyComponentHttpKernelControllerArgumentResolver->getArguments() (line 78 of /var/www/senate-library/vendor/symfony/http-kernel/Controller/ArgumentResolver.php).

非常感谢!

如果你试图使用hook_entity_preserve()钩子,那么你应该按照他们的设计将它移动到sno.module

$entity对象将自动解析为DrupalCoreEntityEntityInterface的实例,这在通过Controller方法执行时不会发生。

<?php
/**
* @file
* Contains sno.module.
*/
use DrupalCoreEntityEntityInterface;
/**
* Implements hook_entity_presave().
*/
function sno_entity_presave(EntityInterface $entity) {
// Do stuff.
}

你可能需要看一下Drupal钩子来了解它是如何工作的。

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

现在你应该移动sno_entity_presave()函数到sno.module,然后它将工作。

相关内容

  • 没有找到相关文章

最新更新