feat(php): Design multipart/form-data requests #4728
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This outlines an approach to support
multipart/form-data
requests with the following new types:Core\MultipartApiRequest
Core\MultipartFormData
Core\MultipartFormDataPart
Utils\File
(user-facing)References:
UX
Users are presented with a generated request type that specifies the
Utils\File
type alongside any other in-lined request parameters.With this, users can create the
File
type by using the primary constructor or any of the other static constructor helper methods, and call the method like so:Implementation
Behind the scenes, the new
Utils\File
type includes a mapper method for theCore\MultipartFormDataPart
:The
MultipartFormDataPart
is a class used to represent individual multipart form data elements in the Guzzle API (docs). It includes atoArray
method that maps into this form that looks like the following:The
MultipartFormData
is simply a collection ofMultipartFormDataPart
elements with additional methods for constructing and adding these parts. It is mapped to Guzzle's representation with anothertoArray
method that looks like the following:Finally, the endpoint is implemented so that we compose a
MultipartFormData
element, and individually add parts based on their wire name (e.g.'number'
for thenumber
property):