Drupal → Bundle classes — киллер фича Drupal 9.3

13.12.2021

В Drupal 9.3 появилась давно ожидаемая возможность создавать классы для отдельных бандлов сущностей. Это нужно, прежде всего, для лучшей организации кода.

Как этим пользоваться на примере создания класса для нод типа product с одним единственным методом, который будет возвращать категорию товара:

1. Создаём интерфейс класса бандла:

// src/Entity/NodeProductInterface.php

namespace Drupal\modulename\Entity;

use Drupal\node\NodeInterface;
use Drupal\taxonomy\TermInterface;

interface NodeProductInterface extends NodeInterface {

  /**
   * Return product category term entity.
   */
  public function getCategory(): ?TermInterface;

}

2. Создаём класс бандла:

// src/Entity/NodeProduct.php

namespace Drupal\modulename\Entity;

use Drupal\node\Entity\Node;
use Drupal\taxonomy\TermInterface;

class NodeProduct extends Node implements NodeProductInterface {

  /**
   * {@inheritDoc}
   */
  public function getCategory(): ?TermInterface {
    return $this->get('field_category')->entity;
  }

}

3. Подключаем класс бандла:

//  modulename.module

use Drupal\modulename\Entity\NodeProduct;

/**
 * Implements hook_entity_bundle_info_alter().
 */
function modulename_entity_bundle_info_alter(array &$bundles): void {
  $bundles['node']['product']['class'] = NodeProduct::class;
}

После этого можно пользоваться методами класса:

// Загружаем ноду любым удобным способом
$product = \Drupal\node\Entity\Node::load(123); /** @var NodeProductInterface $product */
$product = \Drupal\modulename\Entity\NodeProduct::load(123);
$product = \Drupal::entityTypeManager()->getStorage('node')->load(123); /** @var NodeProductInterface $product */

// Пользуемся методами из класса NodeProduct
$product_category = $product->getCategory();

Подробнее

Написанное актуально для
Drupal 9.3+
Похожие записи

Комментарии

Павел
18.01.2022, 03:11

Это работает для любых сущностей, не только у которых есть подтипы. Например для пользователя массив будет такой $bundles['user']['user']['class']

Добавить комментарий