PHPackages                             kelemen/api-nette - 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. [API Development](/categories/api)
4. /
5. kelemen/api-nette

ActiveLibrary[API Development](/categories/api)

kelemen/api-nette
=================

Api for Nette framework

1.0.1(8y ago)181.9k3[2 issues](https://github.com/ricco24/api-nette/issues)[1 PRs](https://github.com/ricco24/api-nette/pulls)MITPHPPHP &gt;= 5.6

Since Jul 5Pushed 5y ago3 watchersCompare

[ Source](https://github.com/ricco24/api-nette)[ Packagist](https://packagist.org/packages/kelemen/api-nette)[ RSS](/packages/kelemen-api-nette/feed)WikiDiscussions master Synced 4w ago

READMEChangelogDependencies (3)Versions (7)Used By (0)

Api Nette
=========

[](#api-nette)

Highly customizable and easy to setup REST api handling for Nette framework.

[![Scrutinizer Code Quality](https://camo.githubusercontent.com/49424f9ae4cd21e2e7f2c1fa92017164caedf6320fbdf2e2307af770b5a76db7/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f726963636f32342f6170692d6e657474652f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/ricco24/api-nette/?branch=master)[![Code Coverage](https://camo.githubusercontent.com/c2fe497733444aad1a3c10803db345d72bdf5c4a74660bcc7ea8d9a3d4c6a064/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f726963636f32342f6170692d6e657474652f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/ricco24/api-nette/?branch=master)[![Build Status](https://camo.githubusercontent.com/390229aafe73891cfb2ae353dc4f0a8a28794d88618d2cec7432fc7c59b8e9ca/68747470733a2f2f7472617669732d63692e6f72672f726963636f32342f6170692d6e657474652e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/ricco24/api-nette)[![Packagist](https://camo.githubusercontent.com/b3b79768a2e032ff09e4a902a0d9f2a55c85db1613e0ff63c3a53502caf99a92/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6b656c656d656e2f6170692d6e657474652e7376673f6d61784167653d3134343030)](https://packagist.org/packages/kelemen/api-nette)

[![SensioLabsInsight](https://camo.githubusercontent.com/183e0f3509fe897490b219bda07dcf572a355bb3011acc665f54a845e744fa70/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f33663430313737392d393863632d343139312d383333392d3866613231316339313766352f6269672e706e67)](https://insight.sensiolabs.com/projects/3f401779-98cc-4191-8339-8fa211c917f5)

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

[](#installation)

```
composer require kelemen/api-nette

```

Prepare to use
--------------

[](#prepare-to-use)

1. First of all you need an Api presenter for handle api requests. You can use `Kelemen\ApiNette\Presenter\ApiPresenter` or write you own.
2. Register new mapping in config.neon

    ```
    application:
        mapping:
            Api: Kelemen\ApiNette\Presenter\*Presenter
    ```
3. Add api route to router. We use keyword **api** for identify api requests.

    ```
    $router[] = new Route("api/", [
        'presenter' => 'Api',
        'action' => 'default'
    ]);
    ```
4. Configure Api (example from config.neon)

    ```
    services:
        - Kelemen\ApiNette\Logger\Storage\DummyLoggerStorage
        - Kelemen\ApiNette\Logger\Logger
        api:
            class: Kelemen\ApiNette\Api
            setup:
                - get('users', 'Custom\Users\ListHandler')
                - get('users/', 'Custom\Users\DetailHandler')
                - put('users/', 'Custom\Users\CrateHandler', [middleware: ['Custom\Auth\Bearer'])
                - post('users/', 'Custom\Users\UpdateHandler', [middleware: ['Custom\Auth\Bearer']])
    ```

Api routes
----------

[](#api-routes)

### Add routes to api

[](#add-routes-to-api)

REST api routes can be defined with shortcut functions (for most used HTTP methods):

- get
- post
- put
- patch
- delete
- options

Or you can add any HTTP method processing with `add($method, $pattern, $handler, $params = [])` function.

```
$api = new Api(...);
$api->add('purge', 'purge/urls', 'Handlers\PurgeHandler')
```

### Route patterns

[](#route-patterns)

In route definition you can use regular patterns or define parameters closed in **&lt;** and **&gt;**. Routes are evaluated in order they was added. So define specific routes first.

```
$api = new Api(...);
$api->get('users', 'Handler');         // exact match for (with our route) /api/users
$api->get('users/', 'Handler');    // parse parameter id from routes like /api/users/10, /api/users/sdk-2323 etc.
$api->get('users//message/', 'Handler'); // parse parameters id and messageId from matched requests

// Optional parameters are not supported. If optional parameter is needed we have to define multiple routes.
$api->get('users//message', 'Handler');
$api->get('users//message/', 'Handler');

// In route definition we can use any regular expression.
$api->options('.*', 'Handler');          // process OPTIONS call for any incoming URL
```

### Route handlers

[](#route-handlers)

Route definition use **lazy loading** from Nette DI Container. Handlers are defined by **type** or by **name** registered in config.neon file. For name definition, prefix service name with **\#**.

```
$api = new Api(...);
$api->get('users', 'Full\Namespace\For\Handler');       // By type
$api->get('users/', '#registeredHandlerName');      // By name
```

### Route parameters

[](#route-parameters)

As parameter is now accepted only **middleware** key. Middleware definition use same **lazy loading** logic as handlers.

```
$api = new Api(...);
$api->get('users', 'Full\Namespace\For\Handler', ['middleware' => [
    'Middleware\Auth\Bearer',   // By type
    '#bearerAuthorization'      // By name
]]);
```

Handler
-------

[](#handler)

Handler provide business logic for resolved api route.

```
use Nette\Http\Request;
use Nette\Http\Response;
use Kelemen\ApiNette\Handler\BaseHandler;
use Kelemen\ApiNette\Response\JsonApiResponse;
use Kelemen\ApiNette\Validator\Validation;

class UserGetHandler extends BaseHandler
{
    // Here we can define validation rules for input parameters (see section Validations below).
    // This function is optional.
    public function validate()
    {
        return [
            new Validation('path', 'id', 'required|integer'),
            new Validation('get', 'page', 'integer:1..100')
        ];
    }

    // Main function. Process request and return ApiResponse.
    public function __invoke(Request $request, Response $response, callable $next)
    {
        // ... do some business logic as filtering, database requests etc.

        // All validated values are acessible via $this->values array
        $id = $this->values['id'];
        if ($id && isset($this->values['page'])) {
            ...
        }

        return new JsonApiResponse(200, ['data' => [
            'id' => 1,
            'name' => 'Samuel'
        ]]);
    }
}
```

Validations
-----------

[](#validations)

**IMPORTANT!**Every parameter is parsed as string! So use **numeric** validation rule instead of integer or float.

Primary validation is handled by [Nette Validators](https://doc.nette.org/cs/2.4/validators). Validations are registered in handlers `validate()` function. All validated input parameters are accessible in handler via `$this->values` array.

If any validation failed, api automatically send response with 400 HTTP code with all validation errors.

### Custom validation rules

[](#custom-validation-rules)

By default you don't need to register new Validator instance to Api. But if you want register new validations or override existing validations you need to create and configure your own Validator instance.

```
$validator = new Kelemen\ApiNette\Validator\Validator();
$validator->setValidator('enum', function ($value, $ruleParams = null) {
    // $value - contains parameter value
    // $ruleParams - contains string from parsed rule after ":"
    return in_array($value, explode(',', $ruleParams));
});

// Usage in validation funciton ...

public function validate()
{
    return new Validation('get', 'name', 'required|enum:Samuel,Peter')
}
```

### Inputs

[](#inputs)

Validator has defined set of default inputs

KeywordDescriptionget$\_GETpost$\_POSTcookie$\_COOKIESfile$\_FILESpostRawfile\_get\_contents("php://input")jsonjson\_decode(file\_get\_contents("php://input"), true)pathParsed params from matched routeIf you want some special input you can add this input to Validator with `setInput($name, InputInterface $input)` function.

Middleware
----------

[](#middleware)

Api flow can be extended by middleware. Middleware interface has only one function `__invoke(Request $request, Response $response, callable $next)`. How middleware works:

```
use Kelemen\ApiNette\Middleware\Middleware;
use Nette\Http\Request;
use Nette\Http\Response;

class CustomMiddleware implements Middleware
{
    public function __invoke(Request $request, Response $response, callable $next)
    {
        // This code is executed before handler (Optional)
        // Example: provide authentification here. If user is authenticated call $next() if no return new response
        if ($request->isSecured()) {
            // Do something ...
        }

        // Call next middleware or handler if last middleware (Optional)
        $resp = $next($request, $response);

        // This code is executed after handler (Optional)
        // Example: add CORS headers here
        $response->setHeader('custom header', 'header value');

        // Mandatory! Every middleware has to return response!
        return $resp;
    }

}
```

If we have 3 middlewares registered as

```
['middleware1', 'middleware2', 'middleware3']
```

Flow will look like:

```
- middleware1
    - middleware2
        - middleware3
            - handler (return Nette\Application\IResponse)
        - middleware3
    - middleware2
- middleware1

```

Flow and Exceptions
-------------------

[](#flow-and-exceptions)

Library is shipped with default api presenter `Kelemen\ApiNette\Presenter\ApiPresenter`. This presenter running api and handle all exceptions (create response depends on catched exception). If you want custom error responses, create and register your own presenter.

**Api throws this exceptions**

ExceptionDescriptionKelemen\\ApiNette\\Exception\\ApiNetteExceptionBase parent exceptionKelemen\\ApiNette\\Exception\\UnresolvedHandlerExceptionHandler registered for resolved route doesn't exists in containerKelemen\\ApiNette\\Exception\\UnresolvedMiddlewareExceptionMiddleware registered for resolved route doesn't exists in containerKelemen\\ApiNette\\Exception\\UnresolvedRouteExceptionNone of the registered routes match given urlKelemen\\ApiNette\\Exception\\ValidationFailedExceptionSome of registered validations failedKelemen\\ApiNette\\Exception\\ValidatorExceptionInput type use in validation is not registered in validatorKelemen\\ApiNette\\Exception\\MiddlewareExceptionMiddleware configuration/processing exceptionBase Implementations
--------------------

[](#base-implementations)

### Middleware

[](#middleware-1)

#### CORSMiddleware

[](#corsmiddleware)

Setup **Access-Control-Allow-Origin** and **Access-Control-Allow-Credentials** headers. Middleware has 3 modes:

- **all** - returns allow-origin as "\*". Credentials header is disabled by standard.
- **mirror** - returns request header "Origin" in allow-origin and credentials header can be configured manually.
- **custom** - allow-origin header has to be configured and credentials header can be configured manually.

### Handler

[](#handler-1)

#### OptionsPreflightHandler

[](#optionspreflighthandler)

Configurable handler for browser CORS preflight request. Configurable response headers:

- Access-Control-Max-Age
- Access-Control-Expose-Headers
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers

###  Health Score

32

—

LowBetter than 69% of packages

Maintenance18

Infrequent updates — may be unmaintained

Popularity25

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 100% 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 ~326 days

Recently: every ~404 days

Total

6

Last Release

2015d ago

Major Versions

0.3.0 → 1.0.02017-05-19

1.0.1 → 2.x-dev2020-12-23

PHP version history (2 changes)0.1.0PHP &gt;= 5.6

2.x-devPHP &gt;= 7.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/72f58e3d494056872274a7cd14323f13cc76e52c966eade5dec3129ea378c182?d=identicon)[kelemen.samuel](/maintainers/kelemen.samuel)

---

Top Contributors

[![ricco24](https://avatars.githubusercontent.com/u/1409647?v=4)](https://github.com/ricco24 "ricco24 (10 commits)")

---

Tags

apinette

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/kelemen-api-nette/health.svg)

```
[![Health](https://phpackages.com/badges/kelemen-api-nette/health.svg)](https://phpackages.com/packages/kelemen-api-nette)
```

###  Alternatives

[tomaj/nette-api

Nette api

36269.8k6](/packages/tomaj-nette-api)[contributte/comgate

Comgate Payment Gateway for Nette Framework

19844.9k1](/packages/contributte-comgate)[m165437/laravel-blueprint-docs

API Blueprint Renderer for Laravel

22779.5k](/packages/m165437-laravel-blueprint-docs)

PHPackages © 2026

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