og-8.x-1.x-dev/src/Plugin/OgGroupResolver/RouteGroupContentResolver.php
src/Plugin/OgGroupResolver/RouteGroupContentResolver.php
<?php
declare(strict_types=1);
namespace Drupal\og\Plugin\OgGroupResolver;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\og\Attribute\OgGroupResolver;
use Drupal\og\GroupTypeManagerInterface;
use Drupal\og\MembershipManagerInterface;
use Drupal\og\OgGroupAudienceHelperInterface;
use Drupal\og\OgResolvedGroupCollectionInterface;
use Drupal\og\OgRouteGroupResolverBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Resolves the group from the route.
*
* This plugin inspects the current route and checks if it is an entity path for
* a group entity.
*/
#[OgGroupResolver(
id: 'route_group_content',
label: new TranslatableMarkup('Groups from the group content entity on the current route'),
description: new TranslatableMarkup('Checks if the current route is an entity path for a group content entity and returns the group(s) that it belongs to.')
)]
class RouteGroupContentResolver extends OgRouteGroupResolverBase {
public function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
RouteMatchInterface $routeMatch,
GroupTypeManagerInterface $groupTypeManager,
EntityTypeManagerInterface $entityTypeManager,
protected readonly MembershipManagerInterface $membershipManager,
protected readonly OgGroupAudienceHelperInterface $groupAudienceHelper,
) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $routeMatch, $groupTypeManager, $entityTypeManager);
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_route_match'),
$container->get('og.group_type_manager'),
$container->get('entity_type.manager'),
$container->get('og.membership_manager'),
$container->get('og.group_audience_helper')
);
}
/**
* {@inheritdoc}
*/
public function resolve(OgResolvedGroupCollectionInterface $collection) {
$entity = $this->getContentEntity();
// Check if the route entity is group content by checking if it has a group
// audience field.
if ($entity && $this->groupAudienceHelper->hasGroupAudienceField($entity->getEntityTypeId(), $entity->bundle())) {
$groups = $this->membershipManager->getGroups($entity);
// The groups are returned as a two-dimensional array. Flatten it.
$groups = array_reduce($groups, 'array_merge', []);
foreach ($groups as $group) {
$collection->addGroup($group, ['route']);
}
}
}
}
