Field Hooks
Field Hooks are Hooks that run on Documents on a per-field basis. They allow you to execute your own logic during specific events of the Document lifecycle. Field Hooks offer incredible potential for isolating your logic from the rest of your Collection Hooks and Global Hooks.
To add Hooks to a Field, use the hooks
property in your Field Config:
Config Options
All Field Hooks accept an array of synchronous or asynchronous functions. These functions can optionally modify the return value of the field before the operation continues. All Field Hooks are formatted to accept the same arguments, although some arguments may be undefined
based the specific hook type.
To add hooks to a Field, use the hooks
property in your Field Config:
The following arguments are provided to all Field Hooks:
Option | Description |
---|---|
| The Collection in which this Hook is running against. If the field belongs to a Global, this will be |
| Custom context passed between Hooks. More details. |
| In the |
| The Field which the Hook is running against. |
| Boolean to denote if this hook is running against finding one, or finding many within the |
| The Global in which this Hook is running against. If the field belongs to a Collection, this will be |
| The name of the operation that this hook is running within. Useful within |
| In the |
| A boolean to denote if the current operation is overriding Access Control. |
| The path to the Field in the schema. |
| In the |
| The sibling data of the Document before changes being applied, only in |
| The previous value of the field, before changes, only in |
| The Web Request object. This is mocked for Local API operations. |
| The path of the Field in the schema. |
| The data of sibling fields adjacent to the field that the Hook is running against. |
| The sibling data of the Document with all Locales. |
| The value of the Field. |
beforeValidate
Runs during the create
and update
operations. This hook allows you to add or format data before the incoming data is validated server-side.
Please do note that this does not run before client-side validation. If you render a custom field component in your front-end and provide it with a validate
function, the order that validations will run in is:
validate
runs on the client- if successful,
beforeValidate
runs on the server validate
runs on the server
In this example, the beforeValidate
hook is used to process the username
field. The hook takes the incoming value of the field and transforms it by trimming whitespace and converting it to lowercase. This ensures that the username is stored in a consistent format in the database.
beforeChange
Immediately following validation, beforeChange
hooks will run within create
and update
operations. At this stage, you can be confident that the field data that will be saved to the document is valid in accordance to your field validations.
In the emailField
, the beforeChange
hook checks the operation
type. If the operation is create
, it performs additional validation or transformation on the email field value. This allows for operation-specific logic to be applied to the field.
afterChange
The afterChange
hook is executed after a field's value has been changed and saved in the database. This hook is useful for post-processing or triggering side effects based on the new value of the field.
In this example, the afterChange
hook is used with a membershipStatusField
, which allows users to select their membership level (Standard, Premium, VIP). The hook monitors changes in the membership status. When a change occurs, it logs the update and can be used to trigger further actions, such as tracking conversion from one tier to another or notifying them about changes in their membership benefits.
afterRead
The afterRead
hook is invoked after a field value is read from the database. This is ideal for formatting or transforming the field data for output.
Here, the afterRead
hook for the dateField
is used to format the date into a more readable format using toLocaleDateString()
. This hook modifies the way the date is presented to the user, making it more user-friendly.
beforeDuplicate
The beforeDuplicate
field hook is called on each locale (when using localization), when duplicating a document. It may be used when documents having the exact same properties may cause issue. This gives you a way to avoid duplicate names on unique
, required
fields or when external systems expect non-repeating values on documents.
This hook gets called before the beforeValidate
and beforeChange
hooks are called.
By Default, unique and required text fields Payload will append "- Copy" to the original document value. The default is not added if your field has its own, you must return non-unique values from your beforeDuplicate hook to avoid errors or enable the disableDuplicate
option on the collection. Here is an example of a number field with a hook that increments the number to avoid unique constraint errors when duplicating a document:
TypeScript
Payload exports a type for field hooks which can be accessed and used as follows: