1. Go to this page and download the library: Download paigejulianne/nanomvc library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use PaigeJulianne\NanoMVC\Controller;
use PaigeJulianne\NanoMVC\Request;
use PaigeJulianne\NanoMVC\Response;
class HomeController extends Controller
{
public function index(Request $request): Response
{
return $this->view('home', [
'title' => 'Welcome',
'message' => 'Hello, World!',
]);
}
}
// Query parameters (?foo=bar)
$request->query('foo');
$request->query('foo', 'default');
$request->allQuery();
// POST data
$request->input('field');
$request->input('field', 'default');
// All input (POST + GET)
$request->all();
$request->only(['field1', 'field2']);
$request->except(['password']);
// Check if exists
$request->has('field');
$request->param('id');
$request->param('id', 'default');
$request->params(); // All route params
$request->method(); // GET, POST, etc.
$request->path(); // /users/123
$request->header('Accept');
$request->cookie('session');
$request->isAjax();
$request->expectsJson();
$request->getContent(); // Raw body
$request->json(); // JSON decoded body
use PaigeJulianne\NanoMVC\Response;
// JSON
$response = Response::json(['data' => 'value'], 200);
// Redirect
$response = Response::redirect('/path', 302);
// Plain text
$response = Response::text('Content', 200);
// HTML
$response = Response::html('<h1>Hello</h1>', 200);
// Share with all views
View::share('appName', 'My App');
View::share(['key1' => 'value1', 'key2' => 'value2']);
<h1><?= htmlspecialchars($title)
use PaigeJulianne\NanoORM;
class Users extends NanoORM
{
// Maps to 'users' table automatically
}
class BlogPost extends NanoORM
{
const TABLE_OVERRIDE = 'blog_posts';
}
class UsersController extends Controller
{
public function index(Request $request): Response
{
$users = Users::getAllObjects();
return $this->view('users.index', ['users' => $users]);
}
public function show(Request $request): Response
{
$user = new Users($request->param('id'));
return $this->view('users.show', ['user' => $user]);
}
public function store(Request $request): Response
{
$data = $this->validate([
'name' => '
use PaigeJulianne\NanoMVC\Session;
// Set and get values
Session::set('user_id', 123);
$userId = Session::get('user_id');
$name = Session::get('name', 'Guest'); // With default
// Check and remove
if (Session::has('user_id')) {
Session::forget('user_id');
}
// Get all session data
$all = Session::all();
// Clear all data
Session::flush();
// Destroy session completely
Session::destroy();
// Set flash message (available only on next request)
Session::flash('success', 'User created successfully!');
// Get flash message (automatically removed)
$message = Session::getFlash('success');
// Get CSRF token (for forms)
$token = Session::csrfToken();
// In your form
<input type="hidden" name="_token" value="<?= Session::csrfToken()
use PaigeJulianne\NanoMVC\FileSessionDriver;
// Use file-based sessions with custom path
$driver = new FileSessionDriver('/path/to/sessions', 7200);
Session::setDriver($driver);
use PaigeJulianne\NanoMVC\RateLimiter;
use PaigeJulianne\NanoMVC\FileRateLimitStore;
// Configure storage (erId;
if (RateLimiter::attempt($key, maxAttempts: 60, decaySeconds: 60)) {
// Within limit - process request
} else {
// Rate limited
$retryAfter = RateLimiter::availableIn($key);
}
// Get remaining attempts
$remaining = RateLimiter::remaining($key, 60);
// Clear rate limit
RateLimiter::clear($key);
use PaigeJulianne\NanoMVC\ThrottleMiddleware;
// 60 requests per minute
Router::get('/api/users', [ApiController::class, 'index'], [
new ThrottleMiddleware(60, 1)
]);
// 100 requests per hour with custom key
Router::post('/api/search', [ApiController::class, 'search'], [
new ThrottleMiddleware(100, 60, fn($req) => $req->header('X-API-Key'))
]);
// Apply to route group
Router::group(['prefix' => 'api', 'middleware' => [new ThrottleMiddleware(120, 1)]], function () {
Router::get('/users', [ApiController::class, 'users']);
Router::get('/posts', [ApiController::class, 'posts']);
});
use PaigeJulianne\NanoMVC\CsrfMiddleware;
// Apply to all POST/PUT/DELETE routes
Router::group(['middleware' => [new CsrfMiddleware()]], function () {
Router::post('/users', [UsersController::class, 'store']);
Router::delete('/users/{id}', [UsersController::class, 'destroy']);
});
// Exclude specific paths (e.g., webhooks)
$csrf = new CsrfMiddleware(['/api/webhooks/*', '/api/stripe/*']);