Los caracteres especiales Route mit no se analizan correctamente en Zend Framework 2

Los URI con caracteres especiales alemanes no funcionan (error 404). Ya he tenido este problema ( aquí ) y se ha resuelto con el modificador Unicode y un asistente de visualización personalizado , que lo usa.

Ahora tengo el mismo problema con una ruta secundaria Segment , pero esta vez el enfoque con el identificador Unicode y un ayudante de vista personalizado no está funcionando.

sld.tld/sport/sportäöüÄÖÜß/cityäöüÄÖÜß solicitudes como sld.tld/sport/sportäöüÄÖÜß/cityäöüÄÖÜß o sld.tld/sport/sportäöüÄÖÜß/cityäöüÄÖÜß/page/123 finalizan con un error 404 .

/module/Catalog/config/module.config.php

  array( 'routes' => array( 'catalog' => array( ... ), 'city' => array( ... ), // works correctly, if I remove the child route 'sport' => array( 'type' => 'MyNamespace\Mvc\Router\Http\UnicodeRegex', 'options' => array( 'regex' => '/catalog/(?[\p{L}\p{Zs}]*)/(?[\p{L}\p{Zs}]*)', 'defaults' => array( 'controller' => 'Catalog\Controller\Catalog', 'action' => 'list-courses', ), 'spec' => '/catalog/%city%/%sport%', ), 'may_terminate' => true, 'child_routes' => array( 'courses' => array( 'type' => 'segment', 'options' => array( 'route' => '[/page/:page]', 'defaults' => array( 'controller' => 'Catalog\Controller\Catalog', 'action' => 'list-courses', ), ), 'may_terminate' => true, ), ) ), ), ), ... ); 

También lo intenté con una ruta secundaria UnicodeRegex :

  'sport' => array( 'type' => 'MyNamespace\Mvc\Router\Http\UnicodeRegex', 'options' => array( 'regex' => '/catalog/(?[\p{L}\p{Zs}]*)/(?[\p{L}\p{Zs}]*)', 'defaults' => array( 'controller' => 'Catalog\Controller\Catalog', 'action' => 'list-courses', ), 'spec' => '/catalog/%city%/%sport%', ), 'may_terminate' => true, 'child_routes' => array( 'courses' => array( 'type' => 'MyNamespace\Mvc\Router\Http\UnicodeRegex', 'options' => array( 'regex' => '/page/(?[\p{N}]*)', 'defaults' => array( 'controller' => 'Catalog\Controller\Catalog', 'action' => 'list-courses', ), 'spec' => '/page/%page%', ), 'may_terminate' => true, ), ) ), 

UnicodeRegex

ver aquí

UnicodeSegment

Extiende Zend\Mvc\Router\Http\Segment y completa la entrada de TODAS las llamadas preg_match(...) con u :

  • '((\G(?P[^:{\[\]]*)(?P[:{\[\]]|$)))u'
  • '(\G\{(?P[^}]+)\}:?)u'
  • '((\G(?P[^:/{\[\]]+)(?:{(?P[^}]+)})?:?))u'
  • '(\G(?P[^}]+)\})u'
  • '(\G' . $this->regex . ')u'
  • '(^' . $this->regex . '$)u'

¿Cómo funciona?

Solutions Collecting From Web of "Los caracteres especiales Route mit no se analizan correctamente en Zend Framework 2"

Solo UnicodeRegex un vistazo a esto, necesita cambiar el método de coincidencia UnicodeRegex para que devuelva la longitud correcta para la parte de la url coincidente, aquí hay un bash de arreglar eso, que parece estar funcionando (al menos para mí) con su configuración

 public function match(Request $request, $pathOffset = null) { if (!method_exists($request, 'getUri')) { return null; } $uri = $request->getUri(); $path = rawurldecode($uri->getPath()); if ($pathOffset !== null) { $result = preg_match('(\G' . $this->regex . ')u', $path, $matches, null, $pathOffset); } else { $result = preg_match('(^' . $this->regex . '$)u', $path, $matches); } if (!$result) { return null; } foreach ($matches as $key => $value) { if (is_numeric($key) || is_int($key) || $value === '') { unset($matches[$key]); } else { $matches[$key] = rawurldecode($value); } } // at this point there's a mismatch between the length of the rawurlencoded path // that all other route helpers use, so we need to match their expectations // to do that we build the matched part from the spec, using the matched params $url = $this->spec; $mergedParams = array_merge($this->defaults, $matches); foreach ($mergedParams as $key => $value) { $spec = '%' . $key . '%'; if (strpos($url, $spec) !== false) { $url = str_replace($spec, rawurlencode($value), $url); } } // make sure the url we built from spec exists in the original uri path if (false === strpos($uri->getPath(), $url)) { return null; } // now we can get the matchedLength $matchedLength = strlen($url); return new RouteMatch($mergedParams, $matchedLength); }