PHPackages                             studiokaizen/framework - 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. studiokaizen/framework

ActiveLibrary[Framework](/categories/framework)

studiokaizen/framework
======================

ZenPHP — a modern zero-dependency PHP 8.4 micro-framework

v1.0.2(1mo ago)071MITPHPPHP ^8.4

Since May 26Pushed 1mo agoCompare

[ Source](https://github.com/studiokaizen/framework)[ Packagist](https://packagist.org/packages/studiokaizen/framework)[ RSS](/packages/studiokaizen-framework/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependenciesVersions (4)Used By (1)

ZenPHP Framework
================

[](#zenphp-framework)

A modern, zero-dependency micro-framework for PHP 8.4.

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

[](#requirements)

- PHP 8.4+
- PDO extension (SQLite or MySQL)
- OpenSSL extension

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

[](#installation)

```
composer require studiokaizen/framework
```

---

Getting Started
---------------

[](#getting-started)

Copy `config.example.php` to `config.php` and fill in your values. Generate an encryption key:

```
php zen key:generate
```

Run migrations:

```
php zen migrate
```

---

Routing
-------

[](#routing)

Routes are defined in `public/index.php`. Every handler receives a `Request` and `Response` and must return a `Response`.

```
use Zen\Http\Request;
use Zen\Http\Response;

$app->get('/', function (Request $request, Response $response) use ($app): Response {
    return $app->view('home');
});

$app->post('/users', function (Request $request, Response $response) use ($app): Response {
    // ...
});

$app->put('/users/:id', function (Request $request, Response $response) use ($app): Response {
    $id = (int) $request->getRouteParam('id');
    // ...
});

$app->patch('/users/:id', function (Request $request, Response $response) use ($app): Response { /* ... */ });
$app->delete('/users/:id', function (Request $request, Response $response) use ($app): Response { /* ... */ });
```

### Route Parameters

[](#route-parameters)

```
$app->get('/posts/:id/comments/:commentId', function (Request $request, Response $response): Response {
    $postId    = (int) $request->getRouteParam('id');
    $commentId = (int) $request->getRouteParam('commentId');
    // ...
});
```

### Route Middleware

[](#route-middleware)

```
$app->get('/dashboard', $handler)->middleware('csrf', 'auth');
$app->post('/api/items', $handler)->middleware('token', 'throttle:60,1');
```

### Route Groups

[](#route-groups)

```
$app->group('/admin', function () use ($app): void {
    $app->get('/', $handler);
    $app->get('/users', $handler);
}, ['csrf', 'auth']);
```

---

Request
-------

[](#request)

```
$request->all();                          // all input (body + query)
$request->input('name');                  // single input value
$request->input('role', 'user');          // with default
$request->only('name', 'email');          // whitelist
$request->query('page', 1);              // query string value
$request->getRouteParam('id');            // route parameter
$request->getHeader('Authorization');     // request header
$request->isJson();                       // Content-Type: application/json
$request->isAjax();                       // X-Requested-With: XMLHttpRequest
$request->getMethod();                    // GET, POST, etc.
$request->getUri();                       // /path?query
$request->getIp();                        // client IP
```

---

Response
--------

[](#response)

```
return $app->view('template', $data);          // render a view (on $app, not $response)
return $response->json($data);                 // JSON response (200)
return $response->json($data, 201);            // JSON with status
return $response->redirect('/path');           // 302 redirect
return $response->status(404)->body('Not found.');
return $response->header('X-Custom', 'value')->json($data);
```

---

Views
-----

[](#views)

Templates live in `resources/views/` and use plain PHP.

```
// resources/views/layout.php
DOCTYPE html>
