В 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+
Комментарии
Это работает для любых сущностей, не только у которых есть подтипы. Например для пользователя массив будет такой $bundles['user']['user']['class']
Добавить комментарий