作者:老葛 亚艾元软件
我在Drupal8的项目中,写了这样一段代码:
function mycustom_load_term_helper($name, $vocabulary){
$terms = taxonomy_term_load_multiple_by_name($name, $vocabulary);
$term = reset($terms);
if(!empty($term)){
//return $term;
}else{
$term = Term::create([
'name' => $name,
'vid' => $vocabulary,
]) ->save();
}
return $term;
}
在其他地方,调用了这里的代码:
//根据赛事文本,自动设置 赛事分类字段
if(!empty($entity->event->value) && empty($entity->field_event->target_id)){
$term = mycustom_load_term_helper($entity->event->value, 'event');
//drupal_set_message($entity->event->value);
if(!empty($term) ){
//\Drupal::logger('my_module')->notice(var_export($term, true));
$entity->field_event->target_id = $term->id();
}
}
大部分情况下,代码都是正确的,但是偶尔会报错。大致的错误信息,就是对于整数类型的数据调用了->id()函数。
这个错误信息偶尔能会出现,一直没有解决,因为很快下面的就正常了,我只需要再运行一下。
我今天仔细分析了这段代码。发现了这样的问题:
Term的save方法是继承自Entity的,在对应的说明里面。
Return value
int Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed.
Entity::save返回的是整数。SAVED_NEW 和SAVED_UPDATED都是定义好的常量整数。
这下问题解决了,这是我改进的代码:
function mycustom_load_term_helper($name, $vocabulary){
$terms = taxonomy_term_load_multiple_by_name($name, $vocabulary);
$term = reset($terms);
if(!empty($term)){
//return $term;
}else{
$term = Term::create([
'name' => $name,
'vid' => $vocabulary,
]);
$term->save();
}
return $term;
}
使用Term::create创建一个$term,对它调用save方法,这时返回的term就是一个对象了。
为了让代码更多健壮一点,其实在调用的时候,可以这么改进:
if(!empty($entity->event->value) && empty($entity->field_event->target_id)){
$term = mycustom_load_term_helper($entity->event->value, 'event');
//if(!empty($term) ){
if ($term instanceof \Drupal\Core\Entity\ContentEntityInterface) {
$entity->field_event->target_id = $term->id();
}
}
这里使用instanceof判断一下,成立的时候调用->id()就不会出错了。