PHPackages                             digi-soft-ug/nikanzophp - 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. [Framework](/categories/framework)
4. /
5. digi-soft-ug/nikanzophp

ActiveLibrary[Framework](/categories/framework)

digi-soft-ug/nikanzophp
=======================

Open-source modular PHP framework with attribute routing, DI, middleware, CLI, and migrations

v0.2.0(2mo ago)17MITPHPPHP ^8.3CI passing

Since Apr 28Pushed 2mo agoCompare

[ Source](https://github.com/digi-soft-ug/NikanzoPHP)[ Packagist](https://packagist.org/packages/digi-soft-ug/nikanzophp)[ Docs](https://github.com/digi-soft-ug/NikanzoPHP)[ RSS](/packages/digi-soft-ug-nikanzophp/feed)WikiDiscussions master Synced today

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

[![CI](https://github.com/digi-soft-ug/NikanzoPHP/actions/workflows/ci.yml/badge.svg)](https://github.com/digi-soft-ug/NikanzoPHP/actions/workflows/ci.yml)[![codecov](https://camo.githubusercontent.com/e6b9de2a00de8c83aa547f5e352c6e4eaa4d7fb4fb15ab9402d4d36bd81965be/68747470733a2f2f636f6465636f762e696f2f67682f646967692d736f66742d75672f4e696b616e7a6f5048502f6272616e63682f6d61696e2f67726170682f62616467652e737667)](https://codecov.io/gh/digi-soft-ug/NikanzoPHP)[![Packagist Downloads](https://camo.githubusercontent.com/033aad85e7ddc8cb70a3470b7eb6063ea481463b4651f046b2341f0c3a1a54aa/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f646967692d736f66742d75672f6e696b616e7a6f7068702e737667)](https://packagist.org/packages/digi-soft-ug/nikanzophp)

NikanzoPHP
==========

[](#nikanzophp)

A lean, fast, secure PHP 8.3 framework for REST APIs and web applications. Built on PSR-7/15 standards with zero magic, full type safety, and a composable middleware pipeline.

> **Target:** Faster boot time and smaller footprint than Symfony, with security-first defaults.

---

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

[](#requirements)

- PHP 8.3+
- Composer 2.x
- Extensions: `ext-pdo`, `ext-pdo_sqlite` (or pdo\_mysql / pdo\_pgsql)

---

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

[](#installation)

```
# As a standalone project
git clone https://github.com/digi-soft-ug/NikanzoPHP.git
cd NikanzoPHP
composer install
cp .env.example .env   # then edit .env

# As a Composer library in your project
composer require digi-soft-ug/nikanzophp
```

---

Quickstart
----------

[](#quickstart)

```
# Start dev server
php -S 127.0.0.1:8000 -t public public/index.php

# Test it
curl http://127.0.0.1:8000/hello
```

---

Core Concepts
-------------

[](#core-concepts)

### Attribute Routing

[](#attribute-routing)

```
use Nikanzo\Core\Attributes\Route;
use Nikanzo\Core\Controller\AbstractController;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

final class UserController extends AbstractController
{
    // GET /api/v1/users/{id}
    #[Route('/users/{id}', methods: ['GET'])]
    public function show(ServerRequestInterface $request, string $id): ResponseInterface
    {
        return $this->json(['id' => $id, 'name' => 'Alice']);
    }
}
```

Route params (`{id}`) are extracted automatically and injected both as method arguments and as request attributes.

### Middleware Pipeline (PSR-15)

[](#middleware-pipeline-psr-15)

```
// bootstrap.php / index.php
$kernel->addMiddleware(new SecurityHeadersMiddleware());
$kernel->addMiddleware(new RequestBodyParserMiddleware());
$kernel->addMiddleware(new JwtAuthMiddleware());
$kernel->addMiddleware(new RateLimitMiddleware(limit: 60, intervalSeconds: 60));
$kernel->addMiddleware(new ErrorHandlerMiddleware(debug: true, logger: $logger));
```

Middleware runs outermost-first (LIFO stack). Add `SecurityHeadersMiddleware` first so headers are always applied.

### Dependency Injection

[](#dependency-injection)

```
use Nikanzo\Core\Attributes\Inject;
use Nikanzo\Core\Attributes\Service;
use Nikanzo\Core\Attributes\Singleton;

#[Singleton]
final class UserRepository
{
    public function __construct(private readonly PDO $db) {}
}

final class UserController extends AbstractController
{
    #[Inject]
    private UserRepository $repo;
}
```

### JWT Auth + Scope Guards

[](#jwt-auth--scope-guards)

```
use Nikanzo\Core\Attributes\RequiredScope;

final class AdminController extends AbstractController
{
    #[Route('/admin/users', methods: ['GET'])]
    #[RequiredScope('admin', 'users:read')]
    public function list(ServerRequestInterface $request): ResponseInterface
    {
        $claims = $request->getAttribute('auth.claims');
        return $this->json(['user' => $claims['sub']]);
    }
}
```

Set `NIKANZO_JWT_SECRET` in `.env`. Token claims are available as `$request->getAttribute('auth.claims')`.

---

AbstractController helpers
--------------------------

[](#abstractcontroller-helpers)

MethodDescription`json($data, $status)`JSON response`render($renderer, $tpl, $ctx)`Twig HTML response`text($body, $status)`Plain-text response`redirect($url, $status)`Redirect response`noContent()`204 No Content`error($message, $status)`JSON error response`created($data, $location)`201 Created with Location header---

Database
--------

[](#database)

### QueryBuilder

[](#querybuilder)

```
use Nikanzo\Core\Database\QueryBuilder;

$users = (new QueryBuilder($pdo, 'users'))
    ->select('id', 'name', 'email')
    ->where('active', 1)
    ->whereNotNull('email_verified_at')
    ->orderBy('name')
    ->limit(20)
    ->offset(0)
    ->get();

// Find by primary key
$user = (new QueryBuilder($pdo, 'users'))->find(42);

// Insert
$id = (new QueryBuilder($pdo, 'users'))->insert(['name' => 'Bob', 'email' => 'bob@example.com']);

// Update with WHERE
(new QueryBuilder($pdo, 'users'))->where('id', 42)->update(['name' => 'Robert']);

// Delete
(new QueryBuilder($pdo, 'users'))->where('id', 42)->delete();

// Count
$total = (new QueryBuilder($pdo, 'users'))->where('active', 1)->count();
```

All values go through PDO prepared statements — no raw interpolation.

### Migrations &amp; Seeds

[](#migrations--seeds)

```
php nikan db:migrate   # runs database/migrations/*.php in timestamp order
php nikan db:seed      # runs database/seeds/*.php
```

```
// database/migrations/20260101120000_create_posts_table.php
return new class implements \Nikanzo\Core\Database\MigrationInterface {
    public function up(\PDO $pdo): void {
        $pdo->exec('CREATE TABLE posts (id INTEGER PRIMARY KEY, title TEXT NOT NULL)');
    }
    public function down(\PDO $pdo): void {
        $pdo->exec('DROP TABLE posts');
    }
};
```

---

Caching (PSR-16)
----------------

[](#caching-psr-16)

```
use Nikanzo\Core\Cache\FileCache;

$cache = new FileCache();          // uses NIKANZO_CACHE_PATH + NIKANZO_CACHE_TTL from .env

$cache->set('key', $value, 300);   // TTL in seconds
$value = $cache->get('key', null); // default if missing/expired
$cache->delete('key');
$cache->clear();
```

---

Events (PSR-14)
---------------

[](#events-psr-14)

```
use Nikanzo\Core\Events\EventDispatcher;
use Nikanzo\Core\Events\ListenerProvider;

$provider = new ListenerProvider();
$provider->addListener(UserRegistered::class, function (UserRegistered $event): void {
    // send welcome email...
});

$dispatcher = new EventDispatcher($provider);
$dispatcher->dispatch(new UserRegistered($user));
```

---

CSRF Protection
---------------

[](#csrf-protection)

```
// Add middleware (HTML forms only — skip for pure-API)
$kernel->addMiddleware(new CsrfMiddleware(new CsrfTokenManager()));

// In a controller, embed the token in a form
$token = $csrfManager->getToken();
//
