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