reviewer-1.2.x-dev/src/Reviewer/BundleEvaluator.php
src/Reviewer/BundleEvaluator.php
<?php
declare(strict_types=1);
namespace Drupal\reviewer\Reviewer;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\reviewer\Plugin\reviewer\Review\ReviewPluginInterface;
use Drupal\reviewer\Reviewer\Review\ReviewInterface;
/**
* Evaluates bundles.
*/
final readonly class BundleEvaluator implements BundleEvaluatorInterface {
// phpcs:ignore Drupal.Commenting.FunctionComment.Missing
public function __construct(
private EntityTypeBundleInfoInterface $entityTypeBundleInfo,
private EntityTypeManagerInterface $entityTypeManager,
) {}
/**
* {@inheritdoc}
*/
public function allBundlesOfReview(ReviewPluginInterface $review): array {
$bundles_in_code = $review->getBundles();
if ($bundles_in_code) {
return $bundles_in_code;
}
$discovered_entity_type = NULL;
if ($review->getConfigEntityId()) {
$entity_type = $this
->entityTypeManager
->getStorage($review->getConfigEntityId())
->getEntityType();
$discovered_entity_type = $entity_type->getBundleOf();
}
if (!$discovered_entity_type) {
return [];
}
$discovered_bundles = $this->entityTypeBundleInfo->getBundleInfo($discovered_entity_type);
return array_keys($discovered_bundles);
}
/**
* {@inheritdoc}
*/
public function reviewHasBundle(
ReviewInterface $review,
array $bundles,
): bool {
$id_has_separator = str_contains($review->getId(), '.');
$bundle_in_set = fn(ReviewInterface $review) => \in_array(explode('.', $review->getId())[1], $bundles, TRUE);
return $id_has_separator && $bundle_in_set($review);
}
/**
* {@inheritdoc}
*/
public function reviewsOfBundles(array $reviews, array $bundles): array {
if ($bundles) {
return array_filter(
$reviews,
fn(ReviewInterface $review) => $this->reviewHasBundle($review, $bundles),
);
}
return $reviews;
}
}
