class JsonapiMaintenanceModeSubscriber

Same name in other branches
  1. 10 core/modules/jsonapi/src/EventSubscriber/JsonapiMaintenanceModeSubscriber.php \Drupal\jsonapi\EventSubscriber\JsonapiMaintenanceModeSubscriber
  2. 11.x core/modules/jsonapi/src/EventSubscriber/JsonapiMaintenanceModeSubscriber.php \Drupal\jsonapi\EventSubscriber\JsonapiMaintenanceModeSubscriber

Maintenance mode subscriber for JSON:API requests.

@internal JSON:API maintains no PHP API. The API is the HTTP API. This class may change at any time and could break any dependencies on it.

Hierarchy

Expanded class hierarchy of JsonapiMaintenanceModeSubscriber

1 string reference to 'JsonapiMaintenanceModeSubscriber'
jsonapi.services.yml in core/modules/jsonapi/jsonapi.services.yml
core/modules/jsonapi/jsonapi.services.yml
1 service uses JsonapiMaintenanceModeSubscriber
jsonapi.maintenance_mode_subscriber in core/modules/jsonapi/jsonapi.services.yml
Drupal\jsonapi\EventSubscriber\JsonapiMaintenanceModeSubscriber

File

core/modules/jsonapi/src/EventSubscriber/JsonapiMaintenanceModeSubscriber.php, line 23

Namespace

Drupal\jsonapi\EventSubscriber
View source
class JsonapiMaintenanceModeSubscriber implements EventSubscriberInterface {
    
    /**
     * The maintenance mode.
     *
     * @var \Drupal\Core\Site\MaintenanceMode
     */
    protected $maintenanceMode;
    
    /**
     * The configuration factory.
     *
     * @var \Drupal\Core\Config\ConfigFactoryInterface
     */
    protected $config;
    
    /**
     * Constructs a new JsonapiMaintenanceModeSubscriber.
     *
     * @param \Drupal\Core\Site\MaintenanceModeInterface $maintenance_mode
     *   The maintenance mode.
     * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
     *   The config factory.
     */
    public function __construct(MaintenanceModeInterface $maintenance_mode, ConfigFactoryInterface $config_factory) {
        $this->maintenanceMode = $maintenance_mode;
        $this->config = $config_factory;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents() {
        $events = [];
        $events[MaintenanceModeEvents::MAINTENANCE_MODE_REQUEST][] = [
            'onMaintenanceModeRequest',
            -800,
        ];
        return $events;
    }
    
    /**
     * Returns response when site is in maintenance mode and user is not exempt.
     *
     * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
     *   The event to process.
     */
    public function onMaintenanceModeRequest(RequestEvent $event) {
        $request = $event->getRequest();
        if ($request->getRequestFormat() !== 'api_json') {
            return;
        }
        // Retry-After will be random within a range defined in jsonapi settings.
        // The goals are to keep it short and to reduce the thundering herd problem.
        $header_settings = $this->config
            ->get('jsonapi.settings')
            ->get('maintenance_header_retry_seconds');
        $retry_after_time = rand($header_settings['min'], $header_settings['max']);
        $http_exception = new HttpException(503, $this->maintenanceMode
            ->getSiteMaintenanceMessage());
        $document = new JsonApiDocumentTopLevel(new ErrorCollection([
            $http_exception,
        ]), new NullIncludedData(), new LinkCollection([]));
        $response = new ResourceResponse($document, $http_exception->getStatusCode(), [
            'Content-Type' => 'application/vnd.api+json',
            'Retry-After' => $retry_after_time,
        ]);
        // Calling RequestEvent::setResponse() also stops propagation of event.
        $event->setResponse($response);
    }

}

Members

Title Sort descending Modifiers Object type Summary
JsonapiMaintenanceModeSubscriber::$config protected property The configuration factory.
JsonapiMaintenanceModeSubscriber::$maintenanceMode protected property The maintenance mode.
JsonapiMaintenanceModeSubscriber::getSubscribedEvents public static function
JsonapiMaintenanceModeSubscriber::onMaintenanceModeRequest public function Returns response when site is in maintenance mode and user is not exempt.
JsonapiMaintenanceModeSubscriber::__construct public function Constructs a new JsonapiMaintenanceModeSubscriber.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.