Http Caching

Http Caching headersopen in new window, ETagopen in new window, and Last-Modified dateopen in new window can be applied directly on each ApiResource, by means of a few helper methods.

With Cache

When you wish to apply caching headers to the response, use the withCache(). It will automatically apply a set of default caching headers, including an ETag and Last-Modified date of the underlying resource (if possible).

Route::get('/addresses/{id}', function ($id) {
    return new AddressResource(Address::findOrFail($id))
        ->withCache();
});

The resulting Http response will look similar to the following:

HTTP/1.0 200 OK
Cache-Control: no-cache, private
Content-Type:  application/json
Date:          Tue, 07 Feb 2023 09:04:36 GMT
Etag:          "2716128cd82490cd01dddbeb2cf84030"
Last-Modified: Tue, 07 Feb 2023 08:55:36 GMT

# ...body not shown...

Customise Headers

To customise the default caching header, you can set them directly before creating a response, via the withCache():

Route::get('/addresses/{id}', function ($id) {
    return new AddressResource(Address::findOrFail($id))
        ->withCache([
            'no_cache' => false
        ]);
});

Alternatively, you may also overwrite the defaultCacheHeaders() method inside your Api Resource instance.

// ...inside your Api Resource...

public function defaultCacheHeaders(): array
{
    return [
        'etag' => $this->getEtag(),
        'last_modified' => $this->getLastModifiedDate(),
        'private' => true,

        'max_age' => 3600,
        's_maxage' => null,
        'must_revalidate' => true,
        'no_cache' => false,
        'no_store' => false,
        'no_transform' => false,
        'public' => false,
        'proxy_revalidate' => false,
        'immutable' => false,
    ];
}

ETag

When invoking the withCache() method, the Api Resource attempts to resolve a default ETag for its underlying resource. See Eloquent ETag for details.

If you wish to specify a custom ETag, then use the withEtag() method. The method accepts either a string value or ETag instance.

Route::get('/addresses/{id}', function ($id) {
    return new AddressResource(Address::findOrFail($id))
        ->withEtag('"a89ca792333a300d726d40ecbbb9b043"');
});

To remove an ETag from the response, you can use the withoutEtag().

Route::get('/addresses/{id}', function ($id) {
    return new AddressResource(Address::findOrFail($id))
        ->withCache()
        ->withoutEtag();
});

Note: Invoking withoutEtag() has no effect when no caching headers or ETag was set!

Last Modified Date

A similar behaviour is true for the Last Modified date, as for ETag; a date is automatically attempted resolved from the underlying resource, when withCache() is invoked.

To specify a custom date, use withLastModifiedDate(). The method accepts a string date or DateTimeInterface.

Route::get('/addresses/{id}', function ($id) {
    return new AddressResource(Address::findOrFail($id))
        ->withLastModifiedDate(now());
});

To remove a Last Modified Date from the response, use withoutLastModifiedDate().

Route::get('/addresses/{id}', function ($id) {
    return new AddressResource(Address::findOrFail($id))
        ->withCache()
        ->withoutLastModifiedDate();
});

Note: Invoking withoutLastModifiedDate() has no effect when no caching headers or Last Modified date was set!