laminas-api-tools/api-tools-hal

Would be nice to allow multiple identifiers for a route

weierophinney opened this issue · 3 comments

I think this would be a useful feature but I'm also open to feedback on how I might be doing it wrong or should be doing something differently. I have a route which includes 3 identifiers. My route essentially looks like

/api/apiname/resource/:resourceId[/subtype1/:subtype1/subtype2/:subtype2]

I don't really want to make another resource which was just resource id and subtype 1, and I don't think putting in 2 optional parts in the route is a good way to go. It doesn't appear that I can set any more than a single string as the identifier. In the example above, the HAL links for the entity won't include both subtype1 and subtype2, but does contain up to :resourceId.

If route identifier were allowed to be an array, it seems that the above would be possible, but considering the number of places that this touches, I wanted to get some feedback on it before going forward with a change or PR.

To me, it seems this could be a good idea and I don't see a problem with being able to support it, but would appreciate feedback.


Originally posted by @dstockto at zfcampus/zf-hal#36

You can do this with RPC calls. See https://github.com/zfcampus/zf-apigility-doctrine/blob/master/src/Server/Controller/RpcController.php for a working example of
/resource/resource_id/field/field_id

Anything deeper than one should be referenced as

/field_resource/field_resource_id


Originally posted by @TomHAnderson at zfcampus/zf-hal#36 (comment)

@dstockto Have you given it a try yet? One other possibility is to use a combination identifier, and split it in your resource. As an example, your route would be /api/apiname/resource[/:resourceId], but the contents of :resourceId would be something like abc-123. Your resource class would then split this into abc and 123, allowing you to get the different keys. This has the added benefit that it would continue to work with the current code.


Originally posted by @weierophinney at zfcampus/zf-hal#36 (comment)

Apigility Doctrine supports multi-key splitting by default using the '.' separator, therefore supporting a route like this: /orderdetails/num.code.
The DoctrineResource is able to query properly the DB, constructing the entity properly, the problem though is the HAL rendering.
If I configure the 'metadata_map' for the resource with 'entity_identifier_name=num' the rendering is done properly but the links it builds are missing the second param (i.e. /orderdetails/num); if I put 'entity_identifier_name=num.code' the request returns the error "Unable to determine entity identifier for object of type "Entity\Orderdetails"; no fields matching 'num.code'".

Of course a very simple callback on event 'renderEntity' pushing the composed key in the 'self' link solves the problem (literally 5 lines of code).

It would be nice though to have the functionality available out of the box from the service configuration.


Originally posted by @MassiAtZend at zfcampus/zf-hal#36 (comment)