phly / PhlyRestfully

ZF2 module for creating RESTful JSON APIs using HAL and API-Problem
108 stars 45 forks source link

Self links of resources with custom identifier are not added when rendering a collection #123

Closed codeliner closed 8 years ago

codeliner commented 10 years ago

I have a DTO coming from my domain that is used as resource. It implements getArrayCopy() and I use the ArraySerializable hydrator. The resource has a custom identifier tracking_id. If the DTO is returned by ResourceListener#onFetch the resource contains a self link as expected. If ResourceListener#onFetchAll returns a collection of DTOs the resources in the response do not contain self links. Here is my configuration:

//routing:

'api' => array(
    'type' => 'Literal',
    'options' => array(
        'route'      => '/api',
    ),
    'may_terminate' => false,
    'child_routes' => array(
        'cargoroutings' => array(
            'type' => 'Segment',
            'options' => array(
                'route'      => '/cargoroutings[/:tracking_id]',
                'constraints' => array(
                    'tracking_id' => '[a-zA-Z0-9-]*',
                ),
                'defaults' => array(
                    'controller' => 'Api\Controller\CargoRoutings',
                ),

            ),
        )
    )
),

//phlyrestfully:
'phlyrestfully' => array(
    'resources' => array(
        'Api\Controller\CargoRoutings' => array(
            'listener' => 'cargo_routing_resource',
            'route_name' => 'api/cargoroutings',
            'identifier_name' => 'tracking_id',
            'collection_name' => 'cargoroutings',
        )
    ),
    'renderer' => array(
        'default_hydrator' => 'ArraySerializable'
    ),
    'metadata_map' => array(
        'CargoBackend\API\Booking\Dto\CargoRoutingDto' => array(
            'hydrator'        => 'ArraySerializable',
            'identifier_name' => 'tracking_id',
            'route'           => 'api/cargoroutings',
        )
    ),
),

//ArrayCopy of my DTO:
return array(
    'tracking_id'      => $this->getTrackingId(),
    'origin'           => $this->getOrigin(),
    'finalDestination' => $this->getFinalDestination(),
    'legs'             => $legsArrayCopy
);

I know, I can listen to the getIdFromResource event and extract the tracking_id by hand, but I think the configuration should be enough. Did I miss something?

codeliner commented 8 years ago

That's nice: Two years later the issue got solved. In the meanwhile I switched to Apigility and then to zend-expressive :) Anyway, thank you @weierophinney

andrewscaya commented 8 years ago

@codeliner

Alexander --

It's all my fault. ;-)

The module got updated in the context of an extended class project in my Zend Framework 2 Advanced class over at Zend. Sorry for the confusion! :-)

Cheers,

Andrew