You are here

Drupal8 Entity::save()的返回值

  作者:老葛 亚艾元软件

  我在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()就不会出错了。


Drupal版本: