Scribe JSON:API Attribute Reference
This document provides comprehensive documentation for all Scribe attribute classes used in the Laravel Doctrine JSON:API package. These attributes enable automatic, detailed, and accurate API documentation generation with Scribe. Each section includes a description, usage guidelines, property details, and direct links to the class source files.
Table of Contents
Overview
Scribe attributes are PHP 8+ attributes that you add to your controller methods or classes. They provide metadata about your JSON:API endpoints, such as resource type, grouping, expected request/response structure, and relationships. Scribe strategies scan for these attributes to generate accurate OpenAPI/Swagger documentation and beautiful docs UIs.
Common Usage
- Place attributes directly above controller methods or classes.
- You can combine multiple attributes on a single method for full endpoint description.
- All attributes are in the
Sowl\JsonApi\Scribe\Attributes
namespace.
Example:
use Sowl\JsonApi\Scribe\Attributes\ResourceRequest;
use Sowl\JsonApi\Scribe\Attributes\ResourceResponse;
use Sowl\JsonApi\Scribe\Attributes\ResourceMetadata;
#[ResourceMetadata(groupName: 'Users', groupDescription: 'Operations related to user resources.')]
class UserController
{
#[ResourceRequest(resourceType: 'users', idType: 'string', idExample: 'abc123')]
#[ResourceResponse(resourceType: 'users', status: 200, description: 'Get a user by ID')]
public function show($id) { /* ... */ }
}
Attributes
ResourceMetadata
Purpose: Provides grouping and descriptive metadata for endpoints or resource classes. Used for grouping endpoints, customizing group names, descriptions, and authentication flags in documentation.
Usage:
- Place on controller classes or methods.
Properties:
groupName: string|null
— The group name for the endpoint or resource.groupDescription: string|null
— Description for the group.subgroup: string|null
— Subgroup name for further grouping.subgroupDescription: string|null
— Description for the subgroup.title: string|null
— Title of the endpoint or resource.description: string|null
— Description of the endpoint or resource.authenticated: bool
— Whether the endpoint requires authentication.
Example:
#[ResourceMetadata(groupName: 'Users', groupDescription: 'Operations related to user resources.')]
class UserController {}
ResourceRequest
Purpose: Marks a controller method as handling a single resource request (show, update, delete) for JSON:API.
Usage:
- Place on methods handling single-resource endpoints.
Properties:
resourceType: string|null
— JSON:API resource type.idType: string|null
— Type of the resource identifier (e.g., string, int).idExample: mixed
— Example value for the resource ID.idParam: string
— Name of the route parameter for the resource ID (default: 'id').acceptHeaders: array
— List of accepted content types (default: ['application/vnd.api+json']).
Example:
#[ResourceRequest(resourceType: 'users', idType: 'string', idExample: 'abc123')]
public function show($id) {}
ResourceRequestList
Purpose: Marks a controller method as handling a resource collection (list) request for JSON:API.
Usage:
- Place on methods that return lists of resources.
Properties:
resourceType: string|null
— JSON:API resource type.acceptHeaders: array
— List of accepted content types (default: ['application/vnd.api+json']).
Example:
#[ResourceRequestList(resourceType: 'users')]
public function index() {}
ResourceRequestCreate
Purpose: Marks a controller method as handling resource creation for JSON:API.
Usage:
- Place on methods that create new resources.
Properties:
resourceType: string|null
— JSON:API resource type.acceptHeaders: array
— List of accepted content types (default: ['application/vnd.api+json']).
Example:
#[ResourceRequestCreate(resourceType: 'users')]
public function store($request) {}
ResourceRequestRelationships
Purpose: Marks a controller method as handling relationship requests for a resource (e.g., /users/{id}/relationships/{relation}
) in JSON:API.
Usage:
- Place on methods that manage relationships endpoints.
Properties:
resourceType: string|null
— JSON:API resource type.idType: string|null
— Type of the resource identifier.idExample: mixed
— Example value for the resource ID.idParam: string
— Name of the route parameter for the resource ID (default: 'id').acceptHeaders: array
— List of accepted content types (default: ['application/vnd.api+json']).
Example:
#[ResourceRequestRelationships(resourceType: 'users', idType: 'string', idExample: 'abc123', idParam: 'id')]
public function relationships($id, $relationship) {}
ResourceResponse
Purpose: Describes the response for a resource endpoint in JSON:API.
Usage:
- Place on methods to specify response details for a resource.
Properties:
resourceType: string|null
— JSON:API resource type.status: int
— HTTP status code (default: 200).description: string|null
— Description of the response.fractalOptions: array
— Options for Fractal transformation.collection: bool
— Whether the response is a collection.pageNumber: int
— Example page number for paginated responses.pageSize: int
— Example page size for paginated responses.contentTypeHeaders: array
— List of content-type headers (default: ['application/vnd.api+json']).
Example:
#[ResourceResponse(resourceType: 'users', status: 200, description: 'Get a user by ID')]
public function show($id) {}
ResourceResponseRelated
Purpose: Describes the response for a related resource endpoint (e.g., /users/{id}/roles
) in JSON:API.
Usage:
- Place on methods returning related resources.
Properties:
resourceType: string|null
— JSON:API resource type.relationshipName: string|null
— Name of the relationship.status: int
— HTTP status code.description: string|null
— Description of the response.fractalOptions: array
— Options for Fractal transformation.collection: bool
— Whether the response is a collection.pageNumber: int
— Example page number.pageSize: int
— Example page size.contentTypeHeaders: array
— List of content-type headers (default: ['application/vnd.api+json']).
Example:
#[ResourceResponseRelated(resourceType: 'users', relationshipName: 'roles', collection: true, description: 'Get related roles for a user')]
public function related($id, $relationship) {}
ResourceResponseRelationships
Purpose: Describes the response for a relationships endpoint (e.g., /users/{id}/relationships/roles
) in JSON:API.
Usage:
- Place on methods returning relationship data.
Properties:
resourceType: string|null
— JSON:API resource type.relationshipName: string|null
— Name of the relationship.status: int
— HTTP status code.description: string|null
— Description of the response.fractalOptions: array
— Options for Fractal transformation.collection: bool
— Whether the response is a collection.pageNumber: int
— Example page number.pageSize: int
— Example page size.contentTypeHeaders: array
— List of content-type headers (default: ['application/vnd.api+json']).
Example:
#[ResourceResponseRelationships(resourceType: 'users', relationshipName: 'roles', collection: true, description: 'Get user roles relationship')]
public function relationships($id, $relationship) {}
Best Practices
- Always annotate your endpoints with the most specific attribute(s) for best documentation results.
- Use
ResourceMetadata
for grouping and descriptions to improve docs navigation. - Use real resource types and relationship names for clarity and accuracy.
- Keep attribute property values up-to-date with your actual API implementation.
- Combine request and response attributes on the same method for complete endpoint documentation.
See Also
- Scribe Documentation
- JSON:API Specification
- Laravel Doctrine JSON:API Scribe Strategies
- Main Scribe Documentation
For further details and advanced usage, see the PHP docblocks in each attribute class and refer to this file from the main Scribe documentation.