comparison core/modules/system/src/MachineNameController.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 namespace Drupal\system;
4
5 use Drupal\Component\Transliteration\TransliterationInterface;
6 use Drupal\Component\Utility\Unicode;
7 use Drupal\Core\Access\CsrfTokenGenerator;
8 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
9 use Symfony\Component\HttpFoundation\JsonResponse;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
12 use Symfony\Component\DependencyInjection\ContainerInterface;
13
14 /**
15 * Controller routines for machine name transliteration routes.
16 */
17 class MachineNameController implements ContainerInjectionInterface {
18
19 /**
20 * The transliteration helper.
21 *
22 * @var \Drupal\Component\Transliteration\TransliterationInterface
23 */
24 protected $transliteration;
25
26 /**
27 * The token generator.
28 *
29 * @var \Drupal\Core\Access\CsrfTokenGenerator
30 */
31 protected $tokenGenerator;
32
33 /**
34 * Constructs a MachineNameController object.
35 *
36 * @param \Drupal\Component\Transliteration\TransliterationInterface $transliteration
37 * The transliteration helper.
38 * @param \Drupal\Core\Access\CsrfTokenGenerator $token_generator
39 * The token generator.
40 */
41 public function __construct(TransliterationInterface $transliteration, CsrfTokenGenerator $token_generator) {
42 $this->transliteration = $transliteration;
43 $this->tokenGenerator = $token_generator;
44 }
45
46 /**
47 * {@inheritdoc}
48 */
49 public static function create(ContainerInterface $container) {
50 return new static(
51 $container->get('transliteration'),
52 $container->get('csrf_token')
53 );
54 }
55
56 /**
57 * Transliterates a string in given language. Various postprocessing possible.
58 *
59 * @param \Symfony\Component\HttpFoundation\Request $request
60 * The input string and language for the transliteration.
61 * Optionally may contain the replace_pattern, replace, lowercase parameters.
62 *
63 * @return \Symfony\Component\HttpFoundation\JsonResponse
64 * The transliterated string.
65 */
66 public function transliterate(Request $request) {
67 $text = $request->query->get('text');
68 $langcode = $request->query->get('langcode');
69 $replace_pattern = $request->query->get('replace_pattern');
70 $replace_token = $request->query->get('replace_token');
71 $replace = $request->query->get('replace');
72 $lowercase = $request->query->get('lowercase');
73
74 $transliterated = $this->transliteration->transliterate($text, $langcode, '_');
75 if ($lowercase) {
76 $transliterated = Unicode::strtolower($transliterated);
77 }
78
79 if (isset($replace_pattern) && isset($replace)) {
80 if (!isset($replace_token)) {
81 throw new AccessDeniedHttpException("Missing 'replace_token' query parameter.");
82 }
83 elseif (!$this->tokenGenerator->validate($replace_token, $replace_pattern)) {
84 throw new AccessDeniedHttpException("Invalid 'replace_token' query parameter.");
85 }
86
87 // Quote the pattern delimiter and remove null characters to avoid the e
88 // or other modifiers being injected.
89 $transliterated = preg_replace('@' . strtr($replace_pattern, ['@' => '\@', chr(0) => '']) . '@', $replace, $transliterated);
90 }
91 return new JsonResponse($transliterated);
92 }
93
94 }