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
,然后它会起作用。
我正在尝试在 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
,然后它会起作用。