renderer = $renderer; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('renderer') ); } /** * Returns the requested rendered contextual links. * * Given a list of contextual links IDs, render them. Hence this must be * robust to handle arbitrary input. * * @param \Symfony\Component\HttpFoundation\Request $request * The Symfony request object. * * @return \Symfony\Component\HttpFoundation\JsonResponse * The JSON response. * * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * Thrown when the request contains no ids. * * @see contextual_preprocess() */ public function render(Request $request) { $ids = $request->request->get('ids'); if (!isset($ids)) { throw new BadRequestHttpException(t('No contextual ids specified.')); } $tokens = $request->request->get('tokens'); if (!isset($tokens)) { throw new BadRequestHttpException(t('No contextual ID tokens specified.')); } $rendered = []; foreach ($ids as $key => $id) { if (!isset($tokens[$key]) || !Crypt::hashEquals($tokens[$key], Crypt::hmacBase64($id, Settings::getHashSalt() . \Drupal::service('private_key')->get()))) { throw new BadRequestHttpException('Invalid contextual ID specified.'); } $element = [ '#type' => 'contextual_links', '#contextual_links' => _contextual_id_to_links($id), ]; $rendered[$id] = $this->renderer->renderRoot($element); } return new JsonResponse($rendered); } }