For simple use cases an ActionPersister
class is available. This allows for storing, updating
or deleting records via API calls: POST, PUT and DELETE. The basic implementation makes use
of form-data and sends a standard request. The implementation can be customised or swapped
out entirely.
The persister works with ApiActionInterface
objects that should provide:
- the hydrating class
- the route and parameters (must be valid in the Connection passed to the persister)
- the properties to change / send to the API
Unlike the Model
, the ActionPersister
is not keyed to a particular class. This is defined
on the action. Custom actions can be passed, provided they implement the interface. For
updates and deletes, the route parameter values are hashed together to act as an id value for
logging / exception purposes.
Errors and exceptions from all methods are converted to ActionPersisterException
instances.
For errors derived from a JSON decoded response, the errors are parsed out and made available
via the ->getErrors()
method. The original response is kept in the exception.
store
and update
will attempt to return a hydrated object - provided that the API returns
the representation after the action is performed.
For complex persistence requirements, implement your own solution.
It is recommended to either extend the AbstractAction
or implement your own typed actions
for your specific use cases. Strongly typing constructors / arguments will ensure that any
API requests will be verified before they are dispatched, reducing the number of round trips
to persist changes.
Sometimes it is advantageous to be able to send "null" as the value for a field. Unfortunately
the Symfony HttpClient uses http_build_query
under the hood to normalise the body data. This
function will strip all keys with null values, however it will leave false, 0 and empty string
as-is.
Your options in this case are:
- substitute empty string or another value to stand in for null
- send a JSON payload through a custom request call (use
['json' => [..array of data..]]
)