2013-05-24 5 views
3

Возможно ли собрать маршрут с параметрами, содержащими косые черты?Параметры маршрута ZF2 с косой чертой

Config:

'someroute' => array(
     'type' => 'Zend\Mvc\Router\Http\Segment', 
     'options' => array(
       'route' => 'someroute/:path', 
       'defaults' => array(
        'controller' => 'Controller', 
        'action' => 'index' 
       ), 
       'constraints' => array(
        'path' => '(.)+' 
       ) 
     ) 
) 

Контроллер:

$path = 'some/subdirectory'; 
$this->url('someroute', array('path' => $path)); 

Результаты в:

http://host.name/someroute/some%2Fsubdirectory 
+2

Это абсолютно предназначен поведение и более чем хотели. 'path' в вашем примере считается параметром и поэтому получает urlencoded. Все остальное будет угрозой безопасности – Sam

+1

, что является очень неудовлетворительным ответом. Я хочу отобразить дерево в seo-friendly. невозможно, что динамическая генерация подпапок недоступна. – machete

+0

, например: у меня есть таксономия дерево и хотим следующие URIs: '/ таксономия/term1/term1subterm1/term1subterm1subsubterm1 /' ' /таксономии/term1/term1subterm2/term1subterm2subsubterm1 /' ' /таксономии/term1/anoterhterm1 /' – machete

ответ

2

Использование rawurldecode() в представлении решает эту проблему, конечно.

1

Просто используйте тип regex маршрута:

'path' => array(
    'type' => 'regex', 
    'options' => array(
     'regex' => '/path(?<path>\/.*)', 
     'defaults' => array(
      'controller' => 'explorer', 
      'action' => 'path', 
     ), 
     'spec' => '/path%path%' 
    ) 
) 
1

у меня была аналогичная проблема, поэтому я отправляю нашел решение с Zend 3 к моему проекту.

По умолчанию компонент Symfony/Zend маршрутизации требует, чтобы параметров соответствуют следующему регулярному выражению: [^ /] +. Это означает, что все символы разрешены кроме /.

Вы должны явно разрешить/быть частью вашего заполнителя путем указания более разрешающего регулярное выражение для него:

'type' => Segment::class, 
       'options' => [ 
        'route' => '/imovel[/:id][/:realtor][/:friendly]', 
        'constraints' => array(
         'friendly' => '.+', 
         'id' => '[0-9]+', 
         'realtor' => 'C[0-9]+' 
        ), 
        'defaults' => [ 
         'controller' => Controller\PropertyController::class, 
         'action' => 'form' 
        ] 
       ] 

В принципе, вы можете разрешить все символы, а затем проверить/trycatch/Validate в действии.

Ref: How to Allow a "/" Character in a Route Parameter