ZF2 | Маршрутизация данных поста с использованием Zend\Mvc\Router\Http\Method

Маршрутизация данных поста в ZF2

Я попытался настроить маршрутизацию в zf2, где все почтовые данные маршрута /connection/add направляются в отдельный метод с использованием этих конфигураций yaml:

router:
  routes:
    home:
      type: literal
      options:
        route: '/'
        defaults:
          controller: Admin\Dashboard
          action:     index

    connection:
      type: literal
      options:
        route: '/connection'
        defaults:
          controller: Admin\Connection
          action:     list

      may_terminate: true
      child_routes:
        add:
          type: literal
          options:
            route: '/add'
            defaults:
              action: add

          may_terminate: true
          child_routes:
            post:
              type: method
              options:
                verb: post
                defaults:
                  action: test

Все в приведенном выше примере работает просто отлично, за исключением самого глубокого дочернего элемента post, который использует тип Zend\Mvc\Router\Http\Method

Ожидаемый результат:

Когда кто-то отправляет данные сообщения на маршрут /connection/add, этот человек будет перенаправлен на действие test.

Фактический результат:

Последний дочерний элемент в приведенной выше маршрутизации игнорируется, и действие add по-прежнему вызывается при отправке данных сообщения, отправленных из формы.

Вопрос:

  • Что мне не хватает?
  • Есть ли способ использовать такую ​​​​маршрутизацию в моем приложении?
  • Если да, то как может выглядеть конфигурация?

person superhero    schedule 22.01.2013    source источник


Ответы (2)


На самом деле это возможно, просто требуется немного более явная конфигурация.

Причина, по которой ваш пример не работал, заключается в том, что маршрутизатор успешно сопоставил ваш маршрут «добавить» и просто вернулся туда, не глядя вперед. Вы должны сказать ему, что он не может завершиться там, установив для 'may_terminate' значение false и явно указав все методы, с которыми вы хотите иметь дело, в файле child_routes.

    add:
        type: Literal
        options:
            route: '/add'
            defaults:
                action: add
        may_terminate: false
        child_routes:
            post:
                type: method
                options:
                    verb: post
                    defaults:
                        action: test
            everythingelse:
                type: method
                options:
                    verb: 'get,head,put,delete'
                    defaults:
                        action: add

Помните, ключ в том, чтобы установить для 'may_terminate' значение false, чтобы маршрутизатор не возвращал совпадение слишком рано.

person Matt Pinkston    schedule 04.04.2013
comment
Используйте $this-›url ('add/everythingelese') в своем представлении, чтобы собрать URL-адрес, если вам нужно. - person akond; 20.08.2013

Вероятно, это потому, что вы получили его как дочерний элемент маршрута добавления, может быть, попробуйте добавить его на тот же уровень, а не как дочерний?

 child_routes:
    add:
      type: literal
      options:
        route: '/add'
        defaults:
          action: add
      may_terminate: true
    post:
      type: method
      options:
        verb: post
        defaults:
          action: test
      may_terminate: true

Сделайте так, чтобы это был не дочерний элемент маршрута «добавить», а родной брат.

person Andrew    schedule 29.01.2013
comment
Разве это не будет соответствовать всем данным поста? Я только хочу перенаправить данные сообщения, которые соответствуют маршруту: '/ add' - person superhero; 10.02.2013