Nano is a very very tiny php app that allows you to create very fast rest interfaces.

v1.4 2023-11-17 10:45 UTC

This package is auto-updated.

Last update: 2024-04-17 11:42:30 UTC


README

nano API

Nano

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads

CONTRIBUTORS WELCOME

Nano is a very very tiny php library that allows you to create very fast rest APIs.

Think it's like Slim but Nano is only ~6.4 Kilobytes.

Requirements

Strictly requires PHP 7.4.

Install

Via Composer

$ composer require midorikocak/nano

Usage

Simply instantiate and include in your app.

require __DIR__ . '/vendor/autoload.php';

use maciejbuchert\nano\Api;

$api = new Api();

I know. It's not static.

Defining REST resources

Defining rest routes and using wildcards are easy.

$message = 'Welcome to Nano';

$api->get('/', function () use ($message) {
    echo json_encode(['message' => $message]);
    http_response_code(200);
});

$api->post('/', function () use ($message) {
    $input = (array)json_decode(file_get_contents('php://input'), true, 512, JSON_THROW_ON_ERROR);
    echo json_encode($input);
    http_response_code(201);
});

$api->get('/echo/{$message}', function ($message) {
    echo json_encode(['message' => $message]);
    http_response_code(200);
});

Basic Auth

It's possible hide your routes behind an authentication layer. Currently it expects basic auth, more methods to come soon.

$authFunction = function ($username, $password) {
    return ($username == 'username' && $password == 'password');
};

$api->auth(function () use (&$api) {

    $api->get('/entries/{id}', function ($id) {
        echo json_encode(['id' => $id]);
        http_response_code(201);
    });

    $api->post('/entries/{id}', function ($id) {
        echo json_encode(['id' => $id]);
        http_response_code(201);
    });

    $api->put('/entries/{id}', function ($id) {
        echo json_encode(['id' => $id]);
        http_response_code(204);
    });

    $api->delete('/entries/{id}', function ($id) {
        http_response_code(204);
    });

}, $authFunction);

Hence the basic auth is not encrypted, using https is strictly advised.

Testing

You can test your live API using Guzzle/Client

<?php

declare(strict_types=1);

namespace maciejbuchert\nano;

use GuzzleHttp\Client;
use PHPUnit\Framework\TestCase;

class IntegrationTest extends TestCase
{
    public function testGet(): void
    {
        $client = new Client(
            [
                'base_uri' => $this->baseUri,
                'http_errors' => false,
            ],
        );

        $response = $client->request('GET', '/echo/hello');
        $this->assertEquals(200, $response->getStatusCode());
        $this->assertStringContainsString('hello', (string)$response->getBody());
    }

Motivation

Mostly educational purposes.

Change log

Please see CHANGELOG for more information on what has changed recently.

Testing

$ composer test

Contributing

Please see CONTRIBUTING and CODE_OF_CONDUCT for details.

Security

If you discover any security related issues, please email mtkocak@gmail.com instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.