3 namespace Drupal\system;
5 use Drupal\Component\Transliteration\TransliterationInterface;
6 use Drupal\Core\Access\CsrfTokenGenerator;
7 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
8 use Symfony\Component\HttpFoundation\JsonResponse;
9 use Symfony\Component\HttpFoundation\Request;
10 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
11 use Symfony\Component\DependencyInjection\ContainerInterface;
14 * Controller routines for machine name transliteration routes.
16 class MachineNameController implements ContainerInjectionInterface {
19 * The transliteration helper.
21 * @var \Drupal\Component\Transliteration\TransliterationInterface
23 protected $transliteration;
26 * The token generator.
28 * @var \Drupal\Core\Access\CsrfTokenGenerator
30 protected $tokenGenerator;
33 * Constructs a MachineNameController object.
35 * @param \Drupal\Component\Transliteration\TransliterationInterface $transliteration
36 * The transliteration helper.
37 * @param \Drupal\Core\Access\CsrfTokenGenerator $token_generator
38 * The token generator.
40 public function __construct(TransliterationInterface $transliteration, CsrfTokenGenerator $token_generator) {
41 $this->transliteration = $transliteration;
42 $this->tokenGenerator = $token_generator;
48 public static function create(ContainerInterface $container) {
50 $container->get('transliteration'),
51 $container->get('csrf_token')
56 * Transliterates a string in given language. Various postprocessing possible.
58 * @param \Symfony\Component\HttpFoundation\Request $request
59 * The input string and language for the transliteration.
60 * Optionally may contain the replace_pattern, replace, lowercase parameters.
62 * @return \Symfony\Component\HttpFoundation\JsonResponse
63 * The transliterated string.
65 public function transliterate(Request $request) {
66 $text = $request->query->get('text');
67 $langcode = $request->query->get('langcode');
68 $replace_pattern = $request->query->get('replace_pattern');
69 $replace_token = $request->query->get('replace_token');
70 $replace = $request->query->get('replace');
71 $lowercase = $request->query->get('lowercase');
73 $transliterated = $this->transliteration->transliterate($text, $langcode, '_');
75 $transliterated = mb_strtolower($transliterated);
78 if (isset($replace_pattern) && isset($replace)) {
79 if (!isset($replace_token)) {
80 throw new AccessDeniedHttpException("Missing 'replace_token' query parameter.");
82 elseif (!$this->tokenGenerator->validate($replace_token, $replace_pattern)) {
83 throw new AccessDeniedHttpException("Invalid 'replace_token' query parameter.");
86 // Quote the pattern delimiter and remove null characters to avoid the e
87 // or other modifiers being injected.
88 $transliterated = preg_replace('@' . strtr($replace_pattern, ['@' => '\@', chr(0) => '']) . '@', $replace, $transliterated);
90 return new JsonResponse($transliterated);