2014-07-01 8 views
5

jestem próby zapisu trasy dziecięcej dla usługi Apigility i tras wszystko dobrze, dopóki przychodzi czas, aby uczynić odnośnik _self ..trasy Apigility dziecko nie coraz rodzic Parametry

GET http://host/api/service/parameter/gui/page 

{ 
    "status": 500, 
    "title": "Unexpected error", 
    "describedBy": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html", 
    "detail": "Missing parameter \"parameter\"", 
    "details": { 
     "code": 0, 
     "message": "Missing parameter \"parameter\"", 
     "trace": "#0 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Segment.php(313): Zend\\Mvc\\Router\\Http\\Segment->buildPath(Array, Array, true, true, Array)\n#1 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Segment.php(409): Zend\\Mvc\\Router\\Http\\Segment->buildPath(Array, Array, false, true, Array)\n#2 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/Part.php(197): Zend\\Mvc\\Router\\Http\\Segment->assemble(Array, Array)\n#3 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Router/Http/TreeRouteStack.php(351): Zend\\Mvc\\Router\\Http\\Part->assemble(Array, Array)\n#4 /vagrant/vendor/zendframework/zendframework/library/Zend/View/Helper/Url.php(100): Zend\\Mvc\\Router\\Http\\TreeRouteStack->assemble(Array, Array)\n#5 [internal function]: Zend\\View\\Helper\\Url->__invoke('parent.rest.s...', Array, Array, true)\n#6 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(610): call_user_func(Object(Zend\\View\\Helper\\Url), 'parent.rest.s...', Array, Array, true)\n#7 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(634): ZF\\Hal\\Plugin\\Hal->fromLink(Object(ZF\\Hal\\Link\\Link))\n#8 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(667): ZF\\Hal\\Plugin\\Hal->fromLinkCollection(Object(ZF\\Hal\\Link\\LinkCollection))\n#9 /vagrant/vendor/zfcampus/zf-hal/src/Plugin/Hal.php(525): ZF\\Hal\\Plugin\\Hal->fromResource(Object(ZF\\Hal\\Entity))\n#10 /vagrant/vendor/zfcampus/zf-hal/src/View/HalJsonRenderer.php(117): ZF\\Hal\\Plugin\\Hal->renderEntity(Object(ZF\\Hal\\Entity))\n#11 /vagrant/vendor/zendframework/zendframework/library/Zend/View/View.php(205): ZF\\Hal\\View\\HalJsonRenderer->render(Object(ZF\\Hal\\View\\HalJsonModel))\n#12 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/View/Http/DefaultRenderingStrategy.php(102): Zend\\View\\View->render(Object(ZF\\Hal\\View\\HalJsonModel))\n#13 [internal function]: Zend\\Mvc\\View\\Http\\DefaultRenderingStrategy->render(Object(Zend\\Mvc\\MvcEvent))\n#14 /vagrant/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\\Mvc\\MvcEvent))\n#15 /vagrant/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\\EventManager\\EventManager->triggerListeners('render', Object(Zend\\Mvc\\MvcEvent), Array)\n#16 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(352): Zend\\EventManager\\EventManager->trigger('render', Object(Zend\\Mvc\\MvcEvent))\n#17 /vagrant/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(327): Zend\\Mvc\\Application->completeRequest(Object(Zend\\Mvc\\MvcEvent))\n#18 /vagrant/public/index.php(38): Zend\\Mvc\\Application->run()\n#19 {main}" 
    } 
} 

Patrząc na ZF2 Dokumentacja MVC, wydaje mi się, że muszę ustawić wpis metadata_map dla mojego parametru .. ale nie ma przykładów dla Apigility. Czytałem ciężko kodowania nie działa, nawet tak, to parameter jest dynamiczna i nie wiadomo, jak to zrobić to wezwanie właściwie od module.config.php

'zf-hal' => array(
    'metadata_map' => array(
     'Parent\\V1\\Rest\\Service\\ServiceEntity' => array(
      'entity_identifier_name' => 'parameter', 
      'route_name' => 'parent.rest.service', 
      'route_identifier_name' => 'parameter', 
      'hydrator' => 'Zend\\Stdlib\\Hydrator\\ObjectProperty', 
     ), 
     'Parent\\V1\\Rest\\Service\\ServiceCollection' => array(
      'entity_identifier_name' => 'parameter', 
      'route_name' => 'parent.rest.service', 
      'route_identifier_name' => 'parameter', 
      'is_collection' => true, 
     ), 
     'Parent\\V1\\Rest\\Gui\\GuiEntity' => array(
      'entity_identifier_name' => 'page', 
      'route_name' => 'parent.rest.service/gui', 
      'route_identifier_name' => 'gui_page', 
      'route_params' => array('parameter'), #<------- unknown setting area, needs to get the parent route identifier somehow... 
      'hydrator' => 'Zend\\Stdlib\\Hydrator\\ObjectProperty', 
     ), 
     'Parent\\V1\\Rest\\Gui\\GuiCollection' => array(
      'entity_identifier_name' => 'page', 
      'route_name' => 'parent.rest.service/gui', 
      'route_identifier_name' => 'gui_page', 
      'route_params' => array('parameter'), 
      'is_collection' => true, 
     ), 
    ), 
), 

EDIT: dodanie konfiguracji routera

'router' => array(
     'routes' => array(
      'parent.rest.service' => array(
       'type' => 'Segment', 
       'options' => array(
        'route' => '/api/service[/:parameter]', 
        'defaults' => array(
         'controller' => 'Parent\\V1\\Rest\\Service\\Controller', 
        ), 
       ), 
       'may_terminate' => true, 
       'child_routes' => array(
        'gui' => array(
         'type' => 'Segment', 
         'options' => array(
          'route' => '/gui[/:page]', 
          'defaults' => array(
           'controller' => 'Parent\\V1\\Rest\\Gui\\Controller', 
          ), 
         ), 
        ) 
       ), 
      ), 
     ), 
    ), 
+0

Czy możesz pokazać proszę podać niektóre szczegóły konfiguracji routera? – Wilt

+0

@Wilt dziękuję za patrzenie, edytowałem, aby dodać konfigurację routera. – Erik

Odpowiedz

1

I mieć trochę doświadczenia z Apigility, ale nie z twoją konfiguracją. O ile mi wiadomo, w rzeczywistości oznacza to, że wtyczka Hal nie może znaleźć wartości dla twojego route_identifier o nazwie parameter i z tego powodu nie może renderować połączenia.

W niektórych swoich metadata_map configs (nr 1 + 2) Wydaje się, że powinna uzyskać wartość z zasobów: Jest to trasa z nazwą trasy:

'route_name' => 'parent.rest.service', 

Aby właściwie czynią tę trasę my potrzebuję identyfikator trasy nazwie parameter:

'route_identifier_name' => 'parameter', 

uzyskać wartość dla tego identyfikatora trasy musimy właściwość o nazwie parameter od podmiotu:

'entity_identifier_name' => 'parameter', 

Najprawdopodobniej jednostka powinna mieć dane w tablicy, a tablica powinna zawierać klucz o nazwie "parametr", wtedy spróbuje uzyskać wartość, która pasuje do tego klucza.


W innym metadata_map config ustawić tablicę „statycznym” params trasy tak:

'route_params' => array('parameter'), 

ta jest niepełna, ponieważ można ustawić tablicę parametrów trasy zawsze z klucza i wartości. więc powinno to być coś takiego:

'route_params' => array('parameter' => 'my_value'), 

Gdzie my_value może być ciągiem liczbę całkowitą itp

Mam nadzieję, że intuicja może pomóc trochę. Wydaje mi się, że nie widzę, gdzie jeszcze może pójść nie tak.

+0

, jeśli wartość parametru jest dynamiczna. Brakuje mi wiedzy, jak go pobrać ... w tym przypadku jest to nazwa użytkownika – Erik

+0

@Erik Jeśli jest to nazwa użytkownika, a nazwa parametru w obiekcie jest 'userName', możesz wtedy odpowiednio ustawić entity_identifier_name. – Wilt

+0

Zmieniłem nazwę na "parametr" w tym pytaniu .. dla celów ogólności .. ale mam poprawną nazwę w moim wdrożeniu. – Erik