2014-07-01 6 views
5

sto cercando di scrivere un percorso bambino per un Servizio Apigility e percorsi tutto bene fino a quando non arriva il momento di rendere il collegamento _self ..percorsi Apigility bambino non ottenere parametri genitore

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}" 
    } 
} 

Guardando lo ZF2 Documentazione MVC, mi rendo conto che ho bisogno di impostare una voce metadata_map per il mio parametro .. ma non esistono esempi per Apigility. Ho letto duro codifica non ha funzionato, anche così, questo parameter è dinamico e non è chiaro come fare quella chiamata correttamente da 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: aggiungendo la configurazione del router

'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

Puoi mostrare per favore mostrare alcuni dettagli sulla configurazione del tuo router? – Wilt

+0

@Wilt grazie per la ricerca, ho modificato per aggiungere la configurazione del router. – Erik

risposta

1

I avere una certa esperienza con Apigility, ma non con il tuo tipo di configurazione. Per quanto ne so, in effetti significa che il plug-in Hal non può trovare un valore per il tuo route_identifier chiamato parameter e per questo motivo non può eseguire il rendering di un collegamento automatico.

In alcuni dei tuoi metadata_map file di configurazione (nr 1 + 2) Sembra come dovrebbe ottenere il valore dalla risorsa: C'è un percorso con nome percorso:

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

per rendere correttamente questo percorso abbiamo bisogno di un identificatore di percorso di nome parameter:

'route_identifier_name' => 'parameter', 

per ottenere il valore di questo identificatore percorso abbiamo bisogno della proprietà denominata parameter dall'entità:

'entity_identifier_name' => 'parameter', 

Molto probabilmente l'entità dovrebbe avere i dati in un array e tale matrice dovrebbe contenere una chiave denominata 'parametro' allora cercherà di ottenere il valore che va con quella chiave.


In un altro metadata_map config di impostare una serie di rotte params 'statici' come questo:

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

Questa è incompleta, perché si imposta una matrice di parametri percorso sempre con una chiave e un valore. quindi questo dovrebbe essere qualcosa di simile:

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

Dove my_value può essere una stringa un intero ecc

Spero che questa intuizione può aiutare un po '. Non mi sembra di vedere completamente dove altro potrebbe andare storto.

+0

se il valore del parametro è dinamico .. Sono in perdita su come afferrarlo ... in questo caso è il nome di un utente – Erik

+0

@Erik Se è il nome dell'utente e il nome del parametro nell'entità è 'userName', è possibile quindi impostare entity_identifier_name di conseguenza. – Wilt

+0

L'ho rinominato in 'parametro' in questa domanda .. per scopi di generalità .. ma ho il nome corretto nella mia distribuzione. – Erik