Маршрут с подстановочными знаками Zend Framework 2

У меня есть следующий маршрут в моем module.config.php:

'routes' => array(
    'admin' => array(
        'type' => 'Segment',
        'options' => array(
            'route' => '/admin[/:controller[/:action]][/]',
            'constraints' => array(
                'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
                'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
            ),
            'defaults' => array(
                '__NAMESPACE__' => 'Admin\Controller',
                'module' => 'Admin',
                'controller' => 'Index',
                'action' => 'index',
            ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
            'wildcard' => array(
                'type' => 'Wildcard',
            )
        ),
        'priority' => 1000
    ),
),

Причина [/] в конце маршрута заключается в вопросе: Маршрут сегмента Zend Framework 2 соответствует 'test', но не 'test/'

Я хочу, чтобы этот маршрут был как в ZF1. Я хочу передать в нем $_GET parameters (например, /id/1/test/2/).

Проблема в том, что этот маршрут на самом деле соответствует /admin/customer/edit//id/20, но не соответствует /admin/customer/edit/id/20

Любые идеи?


person rafaame    schedule 17.12.2013    source источник


Ответы (3)


Ты на правильном пути! Используйте «Wilcard» как тип дочернего маршрута к вашему административному маршруту.

Доступны два варианта: key_value_delimiter и param_delimiter. Оба значения по умолчанию — «/», что соответствует поведению ZF1 по умолчанию для параметров маршрута.

'router' => array(
    'routes' => array(
        'admin' => array(
            'type' => 'Segment',
            'options' => array(                
                'route' => '/admin[/:controller[/:action]]',
                'constraints' => array(
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
                ),
            ),
            'defaults' => array(
                '__NAMESPACE__' => 'Admin\Controller',
                'module' => 'Admin',
                'controller' => 'Index',
                'action' => 'index',
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'wildcard' => array(
                    'type' => 'Wildcard',
                    'options' => array(
                       'key_value_delimiter' => '/',
                       'param_delimiter' => '/'
                    )
                )
            )
        )
    )
)

Если вы хотите обратиться к подстановочному маршруту с помощью url view-helper, вы можете использовать его следующим образом:

$this->url('admin/wildcard', array('id' => 1234, 'foo' => 'bar'));
person Achim    schedule 28.03.2015

Вы можете добавить параметр маршрута для id :

'route' => '/admin[/:controller[/:action]][/:id][/]',
    'constraints' => array(
         'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
         'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
         'id' => '[0-9]+',
),

этот маршрут соответствует admin/customer/edit/20/, поэтому вы можете получить идентификатор в контроллере:

$this->params()->fromRoute('id');

Если вы хотите иметь admin/customer/edit/id/20/, попробуйте:

'route' => '/admin[/:controller[/:action]][id/:id][/]',
person Mohammad Mehdi Habibi    schedule 17.12.2013
comment
Это решение, но не совсем то, что я хочу. - person rafaame; 17.12.2013
comment
Я не уверен, что понимаю вопрос. Я думаю, вы хотите добавить параметр к вашему маршруту. Какой именно маршрут вам нужен? - person Mohammad Mehdi Habibi; 17.12.2013

Если я правильно понимаю, вы пытаетесь получить несколько параметров из URL, верно?

e.g.

Традиционный GET: www.domain.com/ctrl/action?key1=abc&key2=efg& ... & keyN=xyz

Маршрут ZF2: www.domain.com/ctrl/action/key1/abc/key2/efg/.../keyN/xyz

Если это так, это один из способов сделать это:

            'adminPage' => array(
            'type' => 'regex',
            'options' => array(
                'regex' => '/admin/customer/edit[/](?<keyValuePairs>.*)',
                'defaults' => array(
                    'controller' => 'YourProject\Controller\YourController',
                    'action' => 'yourAction',
                ),
                'spec' => '/admin/customer/edit/%keyValuePairs%',
            )

При этом каждый символ после «admin/customer/edit/» будет храниться в параметре «keyValuePairs». В Controller::yourAction получите параметр keyValuePairs, а затем снова разделите строку на осмысленную структуру данных "ключ-значение".

person lawrenceshen    schedule 01.04.2014