A lightweight, modular and extensible PHP MVC Framework built from scratch.
Nue is a lightweight PHP framework designed for developers who want a clean architecture without the overhead of large frameworks.
The framework follows modern software engineering principles and provides its own core components while keeping external dependencies to a minimum. It is intended to be simple, educational, and highly extensible.
- Lightweight architecture
- Modular design
- MVC Architecture
- Layered Architecture
- Composer Autoloading
- HTTP Request
- HTTP Response
- Routing System
- Route Dispatcher
- Middleware Pipeline
- Custom Dependency Injection Container
- Constructor Injection
- Automatic Dependency Resolution
- Method Injection
- Doctrine DBAL Integration
- Query Builder
- CRUD Operations
- Repository Pattern
- Database Abstraction
- BladeOne Template Engine
- Blade Syntax
- Layout Support
- Sections
- Components
- Controller Layer
- Service Layer
- Repository Layer
- Database Layer
- View Layer
Nue/
├── src/
│ ├── Container/
│ ├── Database/
│ ├── Http/
│ ├── Middleware/
│ ├── Router/
│ ├── View/
│ └── ...
│
├── NueDev/
│ ├── bootstrap/
│ ├── public/
│ ├── config/
│ └── Blog/
│
└── vendor/
Browser
│
▼
public/index.php
│
▼
Application
│
▼
Router
│
▼
Route Dispatcher
│
▼
Middleware
│
▼
Controller
│
▼
Service
│
▼
Repository
│
▼
Database
│
▼
BladeOne View
│
▼
Response
$router->get('/blog', [BlogController::class, 'index']);
$router->get('/blog/create', [BlogController::class, 'create']);
$router->post('/blog', [BlogController::class, 'store']);final class BlogController
{
public function __construct(
private BlogService $service,
private ViewInterface $view
) {}
public function index(): string
{
return $this->view->render('index', [
'posts' => $this->service->all(),
]);
}
}final class BlogRepository
{
public function __construct(
private Database $database
) {}
public function all(): array
{
return $this->database
->table('blogs')
->get();
}
}<?php
use Nue\Application;
use Nue\Container\Container;
use Nue\Http\JsonResponse;
use Nue\Http\Request;
use Nue\Middleware\MiddlewareInterface;
use Nue\Router\Router;
/*
|--------------------------------------------------------------------------
| Create Container
|--------------------------------------------------------------------------
*/
$container = new Container();
/*
|--------------------------------------------------------------------------
| Register Services
|--------------------------------------------------------------------------
*/
$container->singleton(
DateTime::class,
fn () => new DateTime()
);
/*
|--------------------------------------------------------------------------
| Create Router
|--------------------------------------------------------------------------
*/
$router = new Router();
/*
|--------------------------------------------------------------------------
| Sample Middleware
|--------------------------------------------------------------------------
*/
final class ApiMiddleware implements MiddlewareInterface
{
public function handle(
Request $request,
Closure $next
): mixed {
// Check API Key
if (
$request->header('X-API-Key') !== 'nue-secret'
) {
return new JsonResponse([
'success' => false,
'message' => 'Unauthorized'
], 401);
}
return $next($request);
}
}
/*
|--------------------------------------------------------------------------
| Register Route
|--------------------------------------------------------------------------
*/
$router
->get('/api/time', function (
DateTime $date
) {
return new JsonResponse([
'success' => true,
'framework' => 'Nue',
'version' => '1.0',
'time' => $date->format('Y-m-d H:i:s')
]);
})
->middleware(ApiMiddleware::class);
/*
|--------------------------------------------------------------------------
| Create Application
|--------------------------------------------------------------------------
*/
$app = new Application(
$container,
$router
);
/*
|--------------------------------------------------------------------------
| Run
|--------------------------------------------------------------------------
*/
$app->run();The repository includes a simple Blog module demonstrating:
- List Posts
- Create Post
- View Post
- Edit Post
- Delete Post
The module showcases how Routing, Controllers, Services, Repositories, Database, and Views work together within the framework.
- PHP 8+
- Composer
- Doctrine DBAL
- BladeOne
- Reflection API
- PHP 8.2+
- Composer
- MySQL / Sqlite
MIT License.