PointArt

Ship powerful features with the simplicity of plain PHP.

A Spring Boot-inspired micro-framework. Attribute-based routing, dependency injection, ORM — no build step, no Composer, no magic.

🚦

Attribute-Based Routing

#[Router] and #[Route] replace verbose config files. Define routes right where your code lives.

🔗

Dependency Injection

#[Wired] auto-injects services and repositories into your controllers — no manual wiring needed.

💾

ORM

#[Entity], #[Column], #[Id] map your classes to database tables. find(), save(), delete() with no SQL.

🔍

Dynamic Repositories

Declare findByNameAndEmail() as abstract — the framework generates the implementation at runtime.

Quick Example

use PointStart\Attributes\Router;
use PointStart\Attributes\Route;
use PointStart\Attributes\HttpMethod;
use PointStart\Core\Renderer;

#[Router(name: 'user', path: '/user')]
class UserController {
    #[Wired]
    private UserRepository $userRepository;

    #[Route('/list', HttpMethod::GET)]
    public function index(): string {
        $users = User::findAll();
        return Renderer::render('user.list', ['users' => $users]);
    }

    #[Route('/show/{id}', HttpMethod::GET)]
    public function show(int $id): string {
        $user = User::find($id);
        return Renderer::render('user.show', ['user' => $user]);
    }

    #[Route('/create', HttpMethod::POST)]
    public function create(
        #[RequestParam] string $name,
        #[RequestParam] string $email
    ): string {
        $user = new User();
        $user->name  = $name;
        $user->email = $email;
        $user->save();
        return Renderer::render('user.show', ['user' => $user]);
    }
}

Why PointArt?