devvime/modpath

A Minimal and Expressive PHP Micro Routing Framework

1.0.9 2025-06-09 07:29 UTC

This package is auto-updated.

Last update: 2025-06-09 07:30:09 UTC


README

A Minimal and Expressive PHP Micro Routing Framework

📦 Installation

composer require devvime/modpath

⚙️ Initial Configuration

require dirname(__DIR__) . '/vendor/autoload.php';

use ModPath\Router\Router;
use ModPath\Controllers\UserController;
use ModPath\Controllers\ProductController;

$router = new Router();

$router->registerRoutes([
    UserController::class,
    ProductController::class,
]);

$router->dispatch();

🧽 Defining a Controller with Routes and Middleware

namespace ModPath\Controllers;

use ModPath\View\View;
use ModPath\Attribute\Route;
use ModPath\Attribute\Prefix;
use ModPath\Attribute\Middleware;
use ModPath\Interface\ControllerInterface;
use ModPath\Middleware\AuthMiddleware;
use ModPath\Middleware\PermissionMiddleware;
use ModPath\Services\UserService;

class UserController implements ControllerInterface
{
    // Optional: Define a route prefix and middleware for all routes in the controller
    #[Prefix(path: '/user', middleware: AuthMiddleware::class)]
    public function __construct(
        private UserService $userService
    ) {}

    #[Route(path: '', method: 'GET')]
    public function index($request, $response): void
    {
        $users = ['Alice', 'Bob', 'Charlie'];
        View::render('users', ['users' => $users]);
    }

    #[Route(path: '/{id:int}', method: 'GET')]
    #[Middleware(PermissionMiddleware::class)]
    public function show($request, $response): void
    {
        $user = $this->userService->getUserInfo($request->params['id']);
        View::render('user', ['id' => $request->params['id'], 'name' => $user]);
    }

    #[Route(path: '', method: 'POST')]
    #[Middleware(PermissionMiddleware::class)]
    public function store($request, $response): void
    {
        echo "Storing new user...";
    }

    #[Route(path: '/{id}', method: 'PUT')]
    #[Middleware(PermissionMiddleware::class)]
    public function update($request, $response): void
    {
        echo "Updating user #{$request->params['id']}...";
    }

    #[Route(path: '/{id}', method: 'DELETE')]
    #[Middleware(PermissionMiddleware::class)]
    public function destroy($request, $response): void
    {
        echo "Deleting user #{$request->params['id']}...";
    }
}

📥 Request Parameters

#[Route(path: 'user/{id}', method: 'POST')]
public function store($request, $response): void
{
    $request->params;   // URL parameters (e.g., $request->params['id'])
    $request->body;     // Parsed JSON body (e.g., $request->body->email)
    $request->query;    // Query string parameters (e.g., $_GET['key'])
    $request->headers;  // HTTP headers
}

📤 Response Handling

#[Route(path: 'user/{id}', method: 'POST')]
#[Middleware(PermissionMiddleware::class)]
public function store($request, $response): void
{
    $response->render('Hello World!'); // Render plain text or HTML

    $response->json([
        'status' => 200,
        'message' => 'Hello World!'
    ]); // Return JSON response
}

🛡️ Middleware Structure

All middleware classes must be placed under ModPath\Middleware and implement the MiddlewareInterface. The handle() method is required and must return a boolean indicating whether to continue the request.

namespace ModPath\Middleware;

use ModPath\Interface\MiddlewareInterface;

class AuthMiddleware implements MiddlewareInterface
{
    public function handle(): bool
    {
        // Authentication logic here
        return true;
    }
}

🧹 Template Engine Syntax

Display Variables

<h1>User Details</h1>
<p>ID: {{ $id }}</p>       <!-- <?= htmlspecialchars($id) ?> -->
<p>Name: {{ $name }}</p>   <!-- <?= htmlspecialchars($name) ?> -->

Loops

<h1>User List</h1>
<ul>
    <loop($users as $user)>
        <li>{{ $user }}</li>
    <endloop>
</ul>

Equivalent to:

<?php foreach ($users as $user): ?>
    <li><?= htmlspecialchars($user) ?></li>
<?php endforeach; ?>

Conditions

<if($a == $b)>
    <p>Values are equal</p>
<elseif($a > $b)>
    <p>A is greater than B</p>
<else>
    <p>Values are different</p>
<endif>

Summary of Template Syntax

Feature Custom Syntax Example PHP Equivalent
Display {{ $name }} <?= htmlspecialchars($name) ?>
If <if($a > $b)> ... <endif> <?php if ($a > $b): ?> ... <?php endif; ?>
Elseif/Else <elseif(...)> ... <else> ... <?php elseif (...) ?> ... <?php else: ?>
Loop <loop($items as $item)> ... <endloop> <?php foreach ($items as $item): ?> ... <?php endforeach; ?>
For <for($x = 0; $x <= 10; $x++)> ... <endfor> <?php for ($x = 0; $x <= 10; $x++): ?> ... <?php endfor; ?>