PHPackages                             zfcampus/zf-api-problem - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [HTTP &amp; Networking](/categories/http)
4. /
5. zfcampus/zf-api-problem

Abandoned → [laminas-api-tools/api-tools-api-problem](/?search=laminas-api-tools%2Fapi-tools-api-problem)ArchivedLibrary[HTTP &amp; Networking](/categories/http)

zfcampus/zf-api-problem
=======================

ZF2 Module providing API-Problem assets and rendering

1.3.0(8y ago)302.5M↓43.1%24[9 issues](https://github.com/zfcampus/zf-api-problem/issues)20BSD-3-ClausePHPPHP ^5.6 || ^7.0

Since Aug 6Pushed 6y ago2 watchersCompare

[ Source](https://github.com/zfcampus/zf-api-problem)[ Packagist](https://packagist.org/packages/zfcampus/zf-api-problem)[ RSS](/packages/zfcampus-zf-api-problem/feed)WikiDiscussions master Synced 2d ago

READMEChangelog (5)Dependencies (7)Versions (22)Used By (20)

ZF Api Problem
==============

[](#zf-api-problem)

> ## Repository abandoned 2019-12-31
>
> [](#repository-abandoned-2019-12-31)
>
> This repository has moved to [laminas-api-tools/api-tools-api-problem](https://github.com/laminas-api-tools/api-tools-api-problem).

[![Build Status](https://camo.githubusercontent.com/4172c75a2c816ec0d672f40c9a57c5b238b43aaf5e0c9e24cd6fec19c43e2715/68747470733a2f2f7365637572652e7472617669732d63692e6f72672f7a6663616d7075732f7a662d6170692d70726f626c656d2e7376673f6272616e63683d6d6173746572)](https://secure.travis-ci.org/zfcampus/zf-api-problem)[![Coverage Status](https://camo.githubusercontent.com/2d5eb5589c29b1d1c927edb21554ca545d443dc6c5de80a20015fe6285a2134b/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f7a6663616d7075732f7a662d6170692d70726f626c656d2f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/zfcampus/zf-api-problem?branch=master)

Introduction
------------

[](#introduction)

This module provides data structures and rendering for the API-Problem format.

- [Problem Details for HTTP APIs](https://tools.ietf.org/html/rfc7807), used for reporting API problems.

Requirements
------------

[](#requirements)

Please see the [composer.json](composer.json) file.

Installation
------------

[](#installation)

Run the following `composer` command:

```
$ composer require zfcampus/zf-api-problem
```

Alternately, manually add the following to your `composer.json`, in the `require` section:

```
"require": {
    "zfcampus/zf-api-problem": "^1.2"
}
```

And then run `composer update` to ensure the module is installed.

Finally, add the module name to your project's `config/application.config.php` under the `modules`key:

```
return [
    /* ... */
    'modules' => [
        /* ... */
        'ZF\ApiProblem',
    ],
    /* ... */
];
```

> ### zf-component-installer
>
> [](#zf-component-installer)
>
> If you use [zf-component-installer](https://github.com/zendframework/zf-component-installer), that plugin will install zf-api-problem as a module for you.

Configuration
=============

[](#configuration)

### User Configuration

[](#user-configuration)

The top-level configuration key for user configuration of this module is `zf-api-problem`.

#### Key: accept\_filters

[](#key-accept_filters)

An array of `Accept` header media types that, when matched, will result in the [ApiProblemListener](#zfapiproblemlistenerapiproblemlistener) handling an `MvcEvent::EVENT_RENDER_ERROR` event.

#### Key: render\_error\_controllers

[](#key-render_error_controllers)

An array of controller service names that, if matched as the `controller` parameter in the MVC `RouteMatch`, will cause the [ApiProblemListener](#zfapiproblemlistenerapiproblemlistener) to handle `MvcEvent::EVENT_RENDER_ERROR` events.

### System Configuration

[](#system-configuration)

The following configuration is provided in `config/module.config.php` to enable the module to function:

```
'service_manager' => [
    'aliases'   => [
        'ZF\ApiProblem\ApiProblemListener'  => 'ZF\ApiProblem\Listener\ApiProblemListener',
        'ZF\ApiProblem\RenderErrorListener' => 'ZF\ApiProblem\Listener\RenderErrorListener',
        'ZF\ApiProblem\ApiProblemRenderer'  => 'ZF\ApiProblem\View\ApiProblemRenderer',
        'ZF\ApiProblem\ApiProblemStrategy'  => 'ZF\ApiProblem\View\ApiProblemStrategy',
    ],
    'factories' => [
        'ZF\ApiProblem\Listener\ApiProblemListener'             => 'ZF\ApiProblem\Factory\ApiProblemListenerFactory',
        'ZF\ApiProblem\Listener\RenderErrorListener'            => 'ZF\ApiProblem\Factory\RenderErrorListenerFactory',
        'ZF\ApiProblem\Listener\SendApiProblemResponseListener' => 'ZF\ApiProblem\Factory\SendApiProblemResponseListenerFactory',
        'ZF\ApiProblem\View\ApiProblemRenderer'                 => 'ZF\ApiProblem\Factory\ApiProblemRendererFactory',
        'ZF\ApiProblem\View\ApiProblemStrategy'                 => 'ZF\ApiProblem\Factory\ApiProblemStrategyFactory',
    ],
],
'view_manager' => [
    // Enable this in your application configuration in order to get full
    // exception stack traces in your API-Problem responses.
    'display_exceptions' => false,
],
```

ZF2 Events
----------

[](#zf2-events)

### Listeners

[](#listeners)

#### ZF\\ApiProblem\\Listener\\ApiProblemListener

[](#zfapiproblemlistenerapiproblemlistener)

The `ApiProblemListener` attaches to three events in the MVC lifecycle:

- `MvcEvent::EVENT_DISPATCH` as a *shared* listener on `Zend\Stdlib\DispatchableInterface` with a priority of `100`.
- `MvcEvent::EVENT_DISPATCH_ERROR` with a priority of `100`.
- `MvcEvent::EVENT_RENDER` with a priority of `1000`.

If the current `Accept` media type does not match the configured API-Problem media types (by default, these are `application/json` and `application/*+json`), then this listener returns without taking any action.

When this listener does take action, the purposes are threefold:

- Before dispatching, the `render_error_controllers` configuration value is consulted to determine if the `ZF\ApiProblem\Listener\RenderErrorListener` should be attached; see [RenderErrorListener](#rendererrorlistener) for more information.
- After dispatching, detects the type of response from the controller; if it is already an `ApiProblem` model, it continues without doing anything. If an exception was thrown during dispatch, it converts the response to an API-Problem response with some information from the exception.
- If a dispatch error occurred, and the `Accept` type is in the set defined for API-Problems, it attempts to cast the dispatch exception into an API-Problem response.

#### ZF\\ApiProblem\\Listener\\RenderErrorListener

[](#zfapiproblemlistenerrendererrorlistener)

This listener is attached to `MvcEvent::EVENT_RENDER_ERROR` at priority `100`. This listener is conditionally attached by `ZF\ApiProblem\Listener\ApiProblemListener` for controllers that require API Problem responses. With a priority of `100`, this ensures that this listener runs before the default ZF2 listener on this event. In cases when it does run, it will cast an exception into an API-problem response.

#### `ZF\ApiProblem\Listener\SendApiProblemResponseListener`

[](#zfapiproblemlistenersendapiproblemresponselistener)

This listener is attached to `SendResponseEvent::EVENT_SEND_RESPONSE` at priority `-500`. The primary purpose of this listener is, on detection of an API-Problem response, to send appropriate headers and the problem details as the content body. If the `view_manager`'s `display_exceptions`setting is enabled, the listener will determine if the API-Problem represents an application exception, and, if so, inject the exception trace as part of the serialized response.

ZF2 Services
------------

[](#zf2-services)

### Event Services

[](#event-services)

- `ZF\ApiProblem\Listener\ApiProblemListener`
- `ZF\ApiProblem\Listener\RenderErrorListener`
- `ZF\ApiProblem\Listener\SendApiProblemResponseListener`

### View Services

[](#view-services)

#### ZF\\ApiProblem\\View\\ApiProblemRenderer

[](#zfapiproblemviewapiproblemrenderer)

This service extends the `JsonRenderer` service from the ZF2 MVC layer. Its primary responsibility is to decorate JSON rendering with the ability to optionally output stack traces.

#### ZF\\ApiProblem\\View\\ApiProblemStrategy

[](#zfapiproblemviewapiproblemstrategy)

This service is a view strategy that detects a `ZF\ApiProblem\View\ApiProblemModel`; when detected, it selects the [ApiProblemRender](#zfapiproblemviewapiproblemrenderer), and injects the response with a `Content-Type` header that contains the `application/problem+json` media type. This is similar in nature to Zend Framework 2's `JsonStrategy`.

### Models

[](#models)

#### ZF\\ApiProblem\\ApiProblem

[](#zfapiproblemapiproblem)

An instance of `ZF\ApiProblem\ApiProblem` serves the purpose of modeling the kind of problem that is encountered. An instance of `ApiProblem` is typically wrapped in an [ApiProblemResponse](#zfapiproblemapiproblemresponse). Most information can be passed into the constructor:

```
class ApiProblem
{
    public function __construct(
        $status,
        $detail,
        $type = null,
        $title = null,
        array $additional = []
    ) {
        /* ... */
    }
}
```

For example:

```
new ApiProblem(404, 'Entity not found');

// or

new ApiProblem(424, $exceptionInstance);
```

#### `ZF\ApiProblem\ApiProblemResponse`

[](#zfapiproblemapiproblemresponse)

An instance of `ZF\ApiProblem\ApiProblemResponse` can be returned from any controller service or ZF2 MVC event in order to short-circuit the MVC lifecycle and immediately return a response. When it is, the response will be converted to the proper JSON structure for an API-Problem, and the `Content-Type` header will be set to the `application/problem+json` media type.

For example:

```
use Zend\Mvc\Controller\AbstractActionController;
use ZF\ApiProblem\ApiProblem;
use ZF\ApiProblem\ApiProblemResponse;

class MyController extends AbstractActionController
{
    /* ... */
    public function fetch($id)
    {
        $entity = $this->model->fetch($id);
        if (! $entity) {
            return new ApiProblemResponse(new ApiProblem(404, 'Entity not found'));
        }
        return $entity;
    }
}
```

###  Health Score

44

—

FairBetter than 90% of packages

Maintenance14

Infrequent updates — may be unmaintained

Popularity51

Moderate usage in the ecosystem

Community34

Small or concentrated contributor base

Maturity67

Established project with proven stability

 Bus Factor1

Top contributor holds 90% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~98 days

Recently: every ~167 days

Total

18

Last Release

2978d ago

Major Versions

0.9.0 → 1.0.0beta12014-03-18

PHP version history (5 changes)0.6.0PHP &gt;=5.3.3

0.8.0PHP &gt;=5.4.8

0.9.1PHP &gt;=5.3.23

1.1.0PHP &gt;=5.5

1.2.0PHP ^5.6 || ^7.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/296074?v=4)[Zend Framework](/maintainers/zendframework)[@zendframework](https://github.com/zendframework)

---

Top Contributors

[![weierophinney](https://avatars.githubusercontent.com/u/25943?v=4)](https://github.com/weierophinney "weierophinney (681 commits)")[![michalbundyra](https://avatars.githubusercontent.com/u/7423207?v=4)](https://github.com/michalbundyra "michalbundyra (16 commits)")[![acabala](https://avatars.githubusercontent.com/u/530622?v=4)](https://github.com/acabala "acabala (11 commits)")[![Wilt](https://avatars.githubusercontent.com/u/2419627?v=4)](https://github.com/Wilt "Wilt (9 commits)")[![MichaelGooden](https://avatars.githubusercontent.com/u/1275012?v=4)](https://github.com/MichaelGooden "MichaelGooden (8 commits)")[![bakura10](https://avatars.githubusercontent.com/u/1198915?v=4)](https://github.com/bakura10 "bakura10 (8 commits)")[![telkins](https://avatars.githubusercontent.com/u/53731?v=4)](https://github.com/telkins "telkins (6 commits)")[![ralphschindler](https://avatars.githubusercontent.com/u/76674?v=4)](https://github.com/ralphschindler "ralphschindler (5 commits)")[![ezimuel](https://avatars.githubusercontent.com/u/475967?v=4)](https://github.com/ezimuel "ezimuel (3 commits)")[![svycka](https://avatars.githubusercontent.com/u/1270782?v=4)](https://github.com/svycka "svycka (2 commits)")[![bartbrinkman](https://avatars.githubusercontent.com/u/8309358?v=4)](https://github.com/bartbrinkman "bartbrinkman (2 commits)")[![Xerkus](https://avatars.githubusercontent.com/u/725842?v=4)](https://github.com/Xerkus "Xerkus (1 commits)")[![artdevgame](https://avatars.githubusercontent.com/u/353729?v=4)](https://github.com/artdevgame "artdevgame (1 commits)")[![ministerofpanic](https://avatars.githubusercontent.com/u/353729?v=4)](https://github.com/ministerofpanic "ministerofpanic (1 commits)")[![neeckeloo](https://avatars.githubusercontent.com/u/1768645?v=4)](https://github.com/neeckeloo "neeckeloo (1 commits)")[![rtuin](https://avatars.githubusercontent.com/u/360150?v=4)](https://github.com/rtuin "rtuin (1 commits)")[![samsonasik](https://avatars.githubusercontent.com/u/459648?v=4)](https://github.com/samsonasik "samsonasik (1 commits)")

---

Tags

restZendFrameworkzfmoduleapi-problem

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/zfcampus-zf-api-problem/health.svg)

```
[![Health](https://phpackages.com/badges/zfcampus-zf-api-problem/health.svg)](https://phpackages.com/packages/zfcampus-zf-api-problem)
```

###  Alternatives

[zfr/zfr-cors

Zend Framework module that let you deal with CORS requests

611.3M3](/packages/zfr-zfr-cors)[zfr/zfr-rest

Zend Framework 2 REST Module.

8120.7k](/packages/zfr-zfr-rest)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
