recurly-8.x-1.x-dev/src/Routing/RecurlyRouteSubscriber.php
src/Routing/RecurlyRouteSubscriber.php
<?php
namespace Drupal\recurly\Routing;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Routing\RouteSubscriberBase;
use Drupal\Core\Routing\RoutingEvents;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
/**
* Subscriber for Recurly routes.
*/
class RecurlyRouteSubscriber extends RouteSubscriberBase {
/**
* The entity manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The Recurly settings.
*
* @var \Drupal\Core\Config\ImmutableConfig
*/
protected $recurlySettings;
/**
* The Recurly entity type machine name.
*
* @var string
*/
protected $entityType;
/**
* The Recurly entity type definition.
*
* @var \Drupal\Core\Entity\EntityTypeInterface
*/
protected $entityDefinition;
/**
* The default route options.
*
* @var array
*/
protected $routeOptions = [];
/**
* Constructs a new RouteSubscriber object.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_manager
* The entity type manager.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config service.
*/
public function __construct(EntityTypeManagerInterface $entity_manager, ConfigFactoryInterface $config_factory) {
$this->entityTypeManager = $entity_manager;
$this->recurlySettings = $config_factory->get('recurly.settings');
$entity_manager_definitions = $this->entityTypeManager->getDefinitions();
$this->entityType = $this->recurlySettings->get('recurly_entity_type');
$this->entityDefinition = $entity_manager_definitions[$this->entityType];
// Set shared route options.
$this->routeOptions = [
'_admin_route' => TRUE,
'_recurly_entity_type_id' => $this->entityType,
'parameters' => [
$this->entityType => [
'type' => 'entity:' . $this->entityType,
],
],
];
// Determine if custom routes should be added.
$this->addRoutes = $this->addRoutes();
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() : array {
$events = parent::getSubscribedEvents();
$events[RoutingEvents::ALTER] = ['onAlterRoutes', 100];
return $events;
}
/**
* {@inheritdoc}
*/
protected function alterRoutes(RouteCollection $collection) {
if (!$this->addRoutes) {
return;
}
if ($recurly_subscriptionlist = $this->entityDefinition->getLinkTemplate('recurly-subscriptionlist')) {
$route = new Route(
$recurly_subscriptionlist,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionListController::subscriptionList',
'_title' => $this->recurlySettings->get('recurly_subscription_max') == 1 ? 'Subscription Summary' : 'Subscription List',
],
[
'_permission' => 'manage recurly subscription',
// If the user does not have access to update this entity, they do
// not have the ability to update the subscription.
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_list' => 'TRUE',
],
$this->routeOptions
);
// Give it a name and add to the route collection.
$collection->add("entity.$this->entityType.recurly_subscriptionlist", $route);
}
if ($recurly_change = $this->entityDefinition->getLinkTemplate('recurly-change')) {
$route = new Route(
$recurly_change,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionSelectPlanController::planSelect',
'_title' => 'Change plan',
'subscription_id' => 'latest',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
'_access_check_recurly_change_plan' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_change", $route);
}
if ($recurly_planchange = $this->entityDefinition->getLinkTemplate('recurly-planchange')) {
$route = new Route(
$recurly_planchange,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionChangeController::changePlan',
'_title' => 'Change subscription',
'operation' => 'change_plan',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
'_access_check_recurly_change_plan' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_planchange", $route);
}
if ($recurly_signup = $this->entityDefinition->getLinkTemplate('recurly-signup')) {
$route = new Route(
$recurly_signup,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionSelectPlanController::planSelect',
'_title' => $this->recurlySettings->get('recurly_subscription_max') == 1 ? 'Signup' : 'Add plan',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_select_plan' => 'TRUE',
],
$this->routeOptions
);
// Give it a name and add it to the route collection.
$collection->add("entity.$this->entityType.recurly_signup", $route);
}
if ($recurly_cancel_latest = $this->entityDefinition->getLinkTemplate('recurly-cancellatest')) {
$route = new Route(
$recurly_cancel_latest,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionCancelController::subscriptionCancel',
'_title' => 'Cancel subscription',
'subscription_id' => 'latest',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
'_access_check_recurly_cancel' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_cancellatest", $route);
}
if ($recurly_cancel = $this->entityDefinition->getLinkTemplate('recurly-cancel')) {
$route = new Route(
$recurly_cancel,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionCancelController::subscriptionCancel',
'_title' => 'Cancel subscription',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_cancel", $route);
}
if ($recurly_reactivate_latest = $this->entityDefinition->getLinkTemplate('recurly-reactivatelatest')) {
$route = new Route(
$recurly_reactivate_latest,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionReactivateController::reactivateSubscription',
'_title' => 'Reactivate',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
'_access_check_recurly_reactivate' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_reactivatelatest", $route);
}
if ($recurly_reactivate = $this->entityDefinition->getLinkTemplate('recurly-reactivate')) {
$route = new Route(
$recurly_reactivate,
[
'_controller' => '\Drupal\recurly\Controller\RecurlySubscriptionReactivateController::reactivateSubscription',
'_title' => 'Reactivate',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_reactivate", $route);
}
// Invoice routes.
if ($recurly_invoices = $this->entityDefinition->getLinkTemplate('recurly-invoices')) {
$route = new Route(
$recurly_invoices,
[
'_controller' => '\Drupal\recurly\Controller\RecurlyInvoicesController::invoicesList',
'_title' => 'Invoices',
'operation' => 'invoices',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_invoices", $route);
}
if ($recurly_invoice = $this->entityDefinition->getLinkTemplate('recurly-invoice')) {
$route = new Route(
$recurly_invoice,
[
'_controller' => '\Drupal\recurly\Controller\RecurlyInvoicesController::getInvoice',
'_title' => 'Invoice',
'operation' => 'invoices',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_invoice", $route);
}
if ($recurly_invoice_pdf = $this->entityDefinition->getLinkTemplate('recurly-invoicepdf')) {
$route = new Route(
$recurly_invoice_pdf,
[
'_controller' => '\Drupal\recurly\Controller\RecurlyInvoicesController::getInvoicePdf',
'_title' => 'Invoice PDF',
'operation' => 'invoices',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_invoicepdf", $route);
}
if ($recurly_coupon = $this->entityDefinition->getLinkTemplate('recurly-coupon')) {
$route = new Route(
$recurly_coupon,
[
'_form' => '\Drupal\recurly\Form\RecurlyRedeemCouponForm',
'_title' => 'Redeem coupon',
'operation' => 'update',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
'_access_check_recurly_coupon' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_coupon", $route);
}
if ($this->recurlySettings->get('recurly_plan_quantity_page') ?: 1) {
if ($recurly_quantity = $this->entityDefinition->getLinkTemplate('recurly-quantity')) {
$route = new Route(
$recurly_quantity,
[
'_form' => '\Drupal\recurly\Form\RecurlyChangeQuantityForm',
'_title' => 'Change quantity',
'operation' => 'update',
],
[
'_entity_access' => "$this->entityType.update",
'_access_check_recurly_user' => 'TRUE',
'_access_check_recurly_local_account' => 'TRUE',
'_access_check_recurly_quantity' => 'TRUE',
],
$this->routeOptions
);
$collection->add("entity.$this->entityType.recurly_quantity", $route);
}
}
}
/**
* Determines if custom routes should be added.
*
* @return bool
* Boolean indicating if custom routes should be created.
*/
protected function addRoutes() {
if ($this->entityDefinition->hasLinkTemplate('recurly-subscriptionlist')) {
return TRUE;
}
if ($this->entityDefinition->hasLinkTemplate('recurly-signup')) {
return TRUE;
}
if ($this->entityDefinition->hasLinkTemplate('recurly-change')) {
return TRUE;
}
if ($this->entityDefinition->hasLinkTemplate('recurly-billing')) {
return TRUE;
}
if ($this->entityDefinition->hasLinkTemplate('recurly-quantity')) {
return TRUE;
}
return FALSE;
}
}
