2014-07-01 19 views
5

Tôi đang cố gắng để viết một con đường em cho một dịch vụ Apigility, và các tuyến đường tất cả mọi thứ tốt đẹp cho đến khi nó đến thời gian để làm cho liên kết _self ..tuyến Apigility con không nhận cha mẹ thông số

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

Nhìn vào ZF2 MVC tài liệu, tôi loại nhận ra tôi cần phải thiết lập một mục nhập metadata_map cho tham số của tôi .. nhưng không có ví dụ cho Apigility tồn tại. Tôi đã đọc cứng mã hóa không hiệu quả, ngay cả như vậy, parameter đây là năng động và vẫn chưa rõ làm thế nào để làm cuộc gọi mà hoàn toàn khỏi 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, 
     ), 
    ), 
), 

chỉnh sửa: thêm các cấu hình 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

Bạn có thể hiển thị vui lòng hiển thị một số chi tiết về cấu hình bộ định tuyến của mình không? – Wilt

+0

@Wilt cảm ơn bạn đã tìm kiếm, tôi đã chỉnh sửa để thêm cấu hình bộ định tuyến. – Erik

Trả lời

1

tôi có một số kinh nghiệm với sự khải thị, nhưng không phải với loại cấu hình của bạn. Theo như tôi biết nó thực sự có nghĩa là plugin Hal không thể tìm thấy giá trị cho số route_identifier được gọi là parameter của bạn và vì điều này, nó không thể hiển thị liên kết tự.

Trong một số metadata_map configs của bạn (nr 1 + 2) nó có vẻ như nó sẽ nhận được các giá trị từ các nguồn: Có một tuyến đường với tên đường:

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

Để render đúng tuyến đường này chúng tôi cần một định tuyến đường được đặt tên parameter:

'route_identifier_name' => 'parameter', 

để có được giá trị cho định tuyến đường này chúng ta cần tài sản đặt tên parameter từ các tổ chức:

'entity_identifier_name' => 'parameter', 

Nhiều khả năng thực thể phải có dữ liệu trong mảng và mảng đó sẽ giữ khóa có tên 'tham số', sau đó sẽ cố gắng lấy giá trị đi kèm với khóa đó.


Trong một metadata_map config bạn đã thiết lập một loạt các params đường 'tĩnh' như thế này:

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

Đây là chưa đầy đủ, bởi vì bạn thiết lập một mảng tham số tuyến đường luôn luôn với một chìa khóa và một giá trị. Vì vậy, điều này nên được một cái gì đó như thế này:

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

đâu my_value có thể là một chuỗi một số nguyên, vv

Tôi hy vọng cái nhìn sâu sắc này có thể giúp bạn một chút. Tôi dường như không hoàn toàn nhìn thấy nơi khác nó có thể đi sai.

+0

nếu giá trị tham số là động .. Tôi đang thua lỗ như thế nào để lấy nó ... trong trường hợp này đó là tên của người dùng – Erik

+0

@Erik Nếu đó là tên người dùng và tên của tham số trong thực thể là 'userName', bạn có thể đặt entity_identifier_name tương ứng. – Wilt

+0

Tôi đổi tên nó thành 'tham số' trong câu hỏi này .. cho mục đích chung .. nhưng tôi có tên chính xác trong triển khai của mình. – Erik

Các vấn đề liên quan