我试图在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
,然后它将工作。