group-8.x-1.x-dev/src/Controller/GroupMembershipController.php
src/Controller/GroupMembershipController.php
<?php
namespace Drupal\group\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityFormBuilderInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\group\Entity\GroupInterface;
use Drupal\group\Entity\Storage\GroupRelationshipStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides group membership route controllers.
*
* This only controls the routes that are not supported out of the box by the
* plugin base \Drupal\group\Plugin\Group\Relation\GroupRelationBase.
*/
class GroupMembershipController extends ControllerBase {
/**
* The current user.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $currentUser;
/**
* The entity form builder.
*
* @var \Drupal\Core\Entity\EntityFormBuilderInterface
*/
protected $entityFormBuilder;
/**
* Constructs a new GroupMembershipController.
*
* @param \Drupal\Core\Session\AccountInterface $current_user
* The current user.
* @param \Drupal\Core\Entity\EntityFormBuilderInterface $entity_form_builder
* The entity form builder.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
*/
public function __construct(AccountInterface $current_user, EntityFormBuilderInterface $entity_form_builder, EntityTypeManagerInterface $entity_type_manager) {
$this->currentUser = $current_user;
$this->entityFormBuilder = $entity_form_builder;
$this->entityTypeManager = $entity_type_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('current_user'),
$container->get('entity.form_builder'),
$container->get('entity_type.manager')
);
}
/**
* Provides the form for joining a group.
*
* @param \Drupal\group\Entity\GroupInterface $group
* The group to join.
*
* @return array
* A group join form.
*/
public function join(GroupInterface $group) {
$storage = $this->entityTypeManager->getStorage('group_content');
assert($storage instanceof GroupRelationshipStorageInterface);
// Pre-populate a group membership with the current user.
$user = $this->entityTypeManager->getStorage('user')->load($this->currentUser->id());
$group_relationship = $storage->createForEntityInGroup($user, $group, 'group_membership');
return $this->entityFormBuilder->getForm($group_relationship, 'group-join');
}
/**
* The _title_callback for the join form route.
*
* @param \Drupal\group\Entity\GroupInterface $group
* The group to join.
*
* @return string
* The page title.
*/
public function joinTitle(GroupInterface $group) {
return $this->t('Join group %label', ['%label' => $group->label()]);
}
/**
* Provides the form for leaving a group.
*
* @param \Drupal\group\Entity\GroupInterface $group
* The group to leave.
*
* @return array
* A group leave form.
*/
public function leave(GroupInterface $group) {
$group_relationship = $group->getMember($this->currentUser)->getGroupRelationship();
return $this->entityFormBuilder->getForm($group_relationship, 'group-leave');
}
}
