I don't pass id as a get or post parameter but I pass it in HTTP header
This does make your REST invalid, so it isn't actually REST anymore. You therefor cannot use the RestfulAbstractController without customization.
You can either write your own abstract controller or you override the getIdentifier
method:
protected function getIdentifier($routeMatch, $request)
{
$identifier = $this->getIdentifierName();
$headers = $request->getHeaders();
$id = $headers->get($identifier)->getFieldValue();
if ($id !== false) {
return $id;
}
return false;
}
Make sure you set the correct identifier name in each controller. In this case, the identifier name should match the name of the header you are using.
Note this will be used for GET, PUT, PATCH, DELETE and HEAD requests, not only for GET!
/edit:
The getIdentifier
method is called in the flow a controller determines which method to run. Normally, it's this:
- The controller is constructed
- The controller's
dispatch
is called (the controller is Dispatchable)
- The
dispatch
triggers an event "dispatch"
- The method
onDispatch
listens to this event
- In the AbstractRestfulController the method tries to determine which method to call
For #5, it checks for example if the request is a GET request. If so, it checks if there is an identifier given. If so, the get()
is used. If not, the getList()
is used. The "if there is an identifier given" check is done with the getIdentifier()
method.
If you extend the AbstractRestfulController with your own abstract controller and override the getIdentifier()
, you can determine your own identifier. This way, you can check for the header instead of the route parameter or query parameter.