Oihana PHP System

OutputDocumentsTrait uses trait:short, trait:short

Provides a standardized way to output documents from controllers.

This trait offers methods to format documents responses, generate URLs for documents, and handle optional response wrapping with PSR-7 response objects. It relies on BaseUrlTrait for URL generation and StatusTrait for response formatting.

Usage example:

$documents = $this->outputDocuments($request, $response, $data, ['page' => 1]);

Table of Contents

Properties

$baseUrl  : string
The application's base URL.

Methods

fail()  : ResponseInterface|null
Generates a structured error response with an HTTP status code and optional detailed messages.
getCurrentPath()  : string
Returns the current application path relative to the base URL.
getFullPath()  : string
Returns the full application URL including the base URL and optional parameters.
getPath()  : string
Generates a path based on the base URL and a provided relative path.
initializeBaseUrl()  : static
Initializes the internal `baseUrl` property.
response()  : ResponseInterface
Return a response in the format accepted by the client : JSON by default or CBOR.
status()  : ResponseInterface|null
Outputs a generic HTTP status message in a JSON response.
success()  : mixed
Outputs a success message with optional JSON metadata.
successWithNewBody()  : mixed
Same as {@see self::success()} but guarantees a fresh response body stream before writing the envelope.
withFreshBody()  : ResponseInterface|null
Returns the same response with a fresh, empty body stream.
documentsResponse()  : object|null
Generates a standardized response for a list of documents.
getDocumentUrl()  : string
Returns the URL associated with the documents response.
outputDocuments()  : array<string|int, mixed>|object|null
Outputs a list of documents, optionally wrapping them in a response object.

Properties

$baseUrl

The application's base URL.

public string $baseUrl = \oihana\enums\Char::EMPTY

Used as a prefix for all generated URLs.

Methods

fail()

Generates a structured error response with an HTTP status code and optional detailed messages.

public fail(ServerRequestInterface|null $request, ResponseInterface|null $response[, int|string|null $code = 400 ][, string|null $details = null ][, array<string|int, mixed> $options = [] ][, string|null $accept = null ]) : ResponseInterface|null

Automatically logs the error if logging is enabled.

Parameters
$request : ServerRequestInterface|null

Optional PSR-7 Request object.

$response : ResponseInterface|null

The PSR-7 Response object.

$code : int|string|null = 400

The HTTP status code (default: 400).

$details : string|null = null

Optional detailed error message to override default description.

$options : array<string|int, mixed> = []

Optional array of additional data to include (e.g., errors).

$accept : string|null = null

The header accepted by the client : 'application/cbor' or by default 'application/json'

Tags
example
return $this->fail(
    $response,
    406,
    'fields validation failed',
    [
        'firstName' => 'firstName is required',
        'lastName'  => 'lastName must be a string'
    ]
);
Return values
ResponseInterface|null

Returns a PSR-7 Response object with JSON content or null if $response is not provided.

getCurrentPath()

Returns the current application path relative to the base URL.

public getCurrentPath([ServerRequestInterface|null $request = null ][, array<string|int, mixed> $params = [] ][, bool $useNow = false ]) : string

Uses the Request object if provided, otherwise falls back to $_SERVER['REQUEST_URI']. Allows adding GET parameters via $params.

Parameters
$request : ServerRequestInterface|null = null

Optional HTTP request

$params : array<string|int, mixed> = []

Optional associative array of GET parameters

$useNow : bool = false

If true, adds a _ parameter with the current timestamp to prevent caching

Return values
string

Full path including the base URL and query parameters

getFullPath()

Returns the full application URL including the base URL and optional parameters.

public getFullPath([array<string|int, mixed>|null $params = null ][, bool $useNow = false ]) : string
Parameters
$params : array<string|int, mixed>|null = null

Optional associative array of GET parameters

$useNow : bool = false

If true, adds a _ parameter with the current timestamp

Return values
string

Full URL

getPath()

Generates a path based on the base URL and a provided relative path.

public getPath([string $path = Char::EMPTY ][, array<string|int, mixed>|null $params = null ][, bool $useNow = false ]) : string
Parameters
$path : string = Char::EMPTY

Relative path to append to the base URL

$params : array<string|int, mixed>|null = null

Optional associative array of GET parameters

$useNow : bool = false

If true, adds a _ parameter with the current timestamp

Return values
string

Full path

initializeBaseUrl()

Initializes the internal `baseUrl` property.

public initializeBaseUrl([array<string|int, mixed> $init = [] ][, ContainerInterface|null $container = null ]) : static

The value can come from:

  • the $init array (key ControllerParam::BASE_URL),
  • the DI container if provided and contains the key ControllerParam::BASE_URL,
  • otherwise it remains an empty string.
Parameters
$init : array<string|int, mixed> = []

Optional initialization array

$container : ContainerInterface|null = null

Optional DI container to fetch the base URL

Tags
throws
ContainerExceptionInterface

If the container encounters an error during access

NotFoundExceptionInterface

If the ControllerParam::BASE_URL key is not found in the container

Return values
static

Returns the current instance for method chaining

response()

Return a response in the format accepted by the client : JSON by default or CBOR.

public response(ResponseInterface $response[, mixed $data = null ][, int $status = 200 ][, string|null $accept = null ]) : ResponseInterface

Checks the Accept header in the request to determine the preferred format.

Parameters
$response : ResponseInterface

PSR-7 Response object to write to.

$data : mixed = null

Data to send in the response.

$status : int = 200

HTTP status code (default: 200).

$accept : string|null = null

The header accepted by the client : 'application/cbor' or by default 'application/json'

Tags
see
FileMimeType::JSON
FileMimeType::CBOR
FileMimeType::CBOR_SEQ
Return values
ResponseInterface

status()

Outputs a generic HTTP status message in a JSON response.

public status(ServerRequestInterface|null $request, ResponseInterface|null $response[, mixed $message = Char::EMPTY ][, int|string|null $code = 200 ][, array<string|int, mixed>|null $options = null ][, string|null $accept = null ]) : ResponseInterface|null
Parameters
$request : ServerRequestInterface|null

Optional PSR-7 Request object.

$response : ResponseInterface|null

PSR-7 Response object to send output.

$message : mixed = Char::EMPTY

The message content.

$code : int|string|null = 200

The HTTP status code (default: 200).

$options : array<string|int, mixed>|null = null

Optional array of additional output properties.

$accept : string|null = null

The header accepted by the client : 'application/cbor' or by default 'application/json'

Tags
example
return $this->status($response, 'bad request', 405);
Return values
ResponseInterface|null

Returns a PSR-7 Response object with JSON content or null if $response is not provided.

success()

Outputs a success message with optional JSON metadata.

public success(ServerRequestInterface|null $request, ResponseInterface|null $response[, mixed $data = null ][, array<string|int, mixed>|null $init = null ][, string|null $accept = null ]) : mixed

If $response is null, returns the $data directly. Supports optional initialization properties like count, limit, offset, owner, URL, status, total, position, options.

Parameters
$request : ServerRequestInterface|null

Optional PSR-7 Request object.

$response : ResponseInterface|null

Optional PSR-7 Response object.

$data : mixed = null

The main payload or data to return.

$init : array<string|int, mixed>|null = null

Optional associative array with keys:

  • count (int): Number of elements
  • limit (int): Pagination limit
  • offset (int): Pagination offset
  • params (array): Parameters for getCurrentPath()
  • status (int): HTTP status code
  • total (int): Total elements
  • url (string): URL to include in response
  • owner (array|object): Owner reference
  • options (array): Additional properties
  • position (int): Optional position in list
$accept : string|null = null

The header accepted by the client : 'application/cbor' or by default 'application/json'

Tags
example
return $this->success(
    $request,
    $response,
    $data,
    [Output::COUNT => count($data), Output::PARAMS => $request->getQueryParams()]
);
Return values
mixed

Returns a PSR-7 Response object with JSON if $response is provided, otherwise returns $data directly.

successWithNewBody()

Same as {@see self::success()} but guarantees a fresh response body stream before writing the envelope.

public successWithNewBody(ServerRequestInterface|null $request, ResponseInterface|null $response[, mixed $data = null ][, array<string|int, mixed>|null $init = null ][, string|null $accept = null ]) : mixed

Use this only when an upstream actor (typically a sub-controller called from the current controller method) may have already written into the shared PSR-7 body stream. Calling the plain success() in that case would concatenate two JSON envelopes — invalid JSON for any strict parser (NextJS RSC, modern fetch, etc.).

Implementation: swaps the response body for an empty stream via self::withFreshBody(), then delegates to success(). Whatever was previously written is discarded; the resulting body contains exactly one envelope.

Parameters
$request : ServerRequestInterface|null

Optional PSR-7 Request object.

$response : ResponseInterface|null

Optional PSR-7 Response object.

$data : mixed = null

The main payload or data to return.

$init : array<string|int, mixed>|null = null

Same keys as success().

$accept : string|null = null

The header accepted by the client.

Tags
example
// POST /users where dispatchAutoInvitation() writes into the shared body
public function post( ?Request $request , ?Response $response , array $args , array $init ) :mixed
{
    $result = parent::post( $request , $response , $args , $init ) ;
    $this->dispatchAutoInvitation( $request , $response , $userKey ) ;

    return $this->successWithNewBody
    (
        $request ,
        $result  ,
        $this->refetchHydratedUser( $userKey )
    ) ;
}
see
success()

Plain variant when the body has not been touched.

Return values
mixed

Same return contract as success().

withFreshBody()

Returns the same response with a fresh, empty body stream.

public withFreshBody(ResponseInterface|null $response) : ResponseInterface|null

Use to discard whatever an upstream actor (sub-controller, middleware) may have already written, then chain into any other response helper.

Parameters
$response : ResponseInterface|null

Optional PSR-7 Response object.

Tags
example
return $this->fail( $request , $this->withFreshBody( $response ) , 502 , 'zitadel_sync_failed' ) ;
Return values
ResponseInterface|null

The same response with a fresh empty body, or null if $response was null.

documentsResponse()

Generates a standardized response for a list of documents.

protected documentsResponse([ServerRequestInterface|null $request = null ][, ResponseInterface|null $response = null ][, array<string|int, mixed>|null $documents = null ][, array<string|int, mixed> $params = [] ][, array<string|int, mixed>|null $options = null ]) : object|null

Wraps the given documents in a success response, including count, options, and a document URL.

Parameters
$request : ServerRequestInterface|null = null

Optional PSR-7 request object.

$response : ResponseInterface|null = null

Optional PSR-7 response object.

$documents : array<string|int, mixed>|null = null

Optional array of documents to include in the response.

$params : array<string|int, mixed> = []

Optional parameters used for URL generation.

$options : array<string|int, mixed>|null = null

Optional additional options to include in the response.

Return values
object|null

Returns a success-wrapped object if $response is provided; otherwise null.

getDocumentUrl()

Returns the URL associated with the documents response.

protected getDocumentUrl([ServerRequestInterface|null $request = null ][, array<string|int, mixed> $params = [] ]) : string

By default, this method uses BaseUrlTrait::getCurrentPath() but can be overridden in the controller to provide a custom URL generation logic.

Parameters
$request : ServerRequestInterface|null = null

Optional PSR-7 request object.

$params : array<string|int, mixed> = []

Optional parameters to append to the URL.

Return values
string

The generated document URL.

outputDocuments()

Outputs a list of documents, optionally wrapping them in a response object.

protected outputDocuments([ServerRequestInterface|null $request = null ][, ResponseInterface|null $response = null ][, array<string|int, mixed>|null $documents = null ][, array<string|int, mixed> $params = [] ][, array<string|int, mixed>|null $options = null ]) : array<string|int, mixed>|object|null

If a PSR-7 Response object is provided, the documents are wrapped using documentsResponse(). Otherwise, the raw array of documents is returned.

Parameters
$request : ServerRequestInterface|null = null

Optional PSR-7 request object.

$response : ResponseInterface|null = null

Optional PSR-7 response object.

$documents : array<string|int, mixed>|null = null

Optional array of documents to output.

$params : array<string|int, mixed> = []

Optional parameters for URL generation.

$options : array<string|int, mixed>|null = null

Optional additional response options.

Return values
array<string|int, mixed>|object|null

Returns a wrapped response object if $response is provided, otherwise the raw documents array or null.

On this page

Search results