Search by

jostar / beach

janoppor

Yet another minimal PHP Framework

v0.1.2 2026-09-08 12:15 UTC

This package is not auto-updated.

Last update: 2026-09-08 12:16:13 UTC


README

Yet another minimal php framwork with a json-file DB. Less than 1500 lines of code

Framework

jostar/beach (via Composer). Minimales PHP-Framework (<1500 Zeilen) mit JSON-File-Datenbank. Kein SQL, keine Migration – Daten liegen als JSON in `data/

.json`.

Einstiegspunkt

public/index.php – hier werden alle Routen registriert, dann App::init() und App::run() aufgerufen. session_start() steht nach App::init().

Routing

Route::get('/pfad', [MeinController::class, 'methode']);
Route::post('/pfad', [MeinController::class, 'methode']);
Route::get('/pfad/{id:number}', [MeinController::class, 'show']); // Wildcard

// Middleware + Prefix gruppieren:
Route::middleware([AuthMiddleware::class], function () {
    Route::prefix('bereich', function () {
        Route::get('/', [Controller::class, 'index']);
    });
});

Controller

Namespace Jostar\App, Datei in classes/. Methoden geben view(...) oder redirect(...) zurück. URL-Parameter ({id:number}) werden als int $id injiziert, POST-Daten über Request $request ($request->post).

namespace Jostar\App;
use Jostar\Beach\Request;
use Jostar\App\Model\Ding;

class DingController {
    public function index()          { return view('ding/index', ['items' => Ding::all()]); }
    public function create()         { return view('ding/create', ['errors' => [], 'old' => []]); }
    public function store(Request $r){ Ding::insert($r->post); redirect('/ding'); }
    public function show(int $id)    { return view('ding/show', ['item' => Ding::find($id)]); }
    public function edit(int $id)    { return view('ding/edit', ['item' => Ding::find($id), 'errors' => []]); }
    public function update(Request $r, int $id) { Ding::update($id, $r->post); redirect('/ding/'.$id); }
    public function destroy(int $id) { Ding::delete($id); redirect('/ding'); }
}

Model

Namespace Jostar\App\Model, Datei in classes/Model/. Nur $table angeben – alles andere kommt von der Basisklasse.

namespace Jostar\App\Model;
use Jostar\Beach\DB\Model;

class Ding extends Model {
    protected static string $table = 'dinge'; // → data/dinge.json
}

Verfügbare statische Methoden: all(), find($id), first(), insert(array), update($id, array), delete($id), where($field, $value), orderBy($field, $dir), limit($n).

Views

Liegen in views/<name>.php. Aufruf: view('ordner/datei', ['key' => $val]) – Variablen stehen direkt im Template zur Verfügung. Kein Templating-System, reines PHP. Inline-HTML mit <?= htmlspecialchars($var) ?>.

Config

Beim Aufruf von App::init($path) wird eine optionale .env aus dem Projektverzeichnis geladen. Bereits gesetzte Server- oder Container-Variablen werden dabei nicht überschrieben. Die Werte stehen unter anderem über getenv() zur Verfügung.

APP_ENV=local
API_KEY=einen-langen-zufaelligen-schluessel

Eine .env sollte nicht versioniert werden. Stattdessen kann eine .env.example ohne geheime Werte als Vorlage dienen.

config.php gibt ein Array zurück. Zugriff: Config::get('schluessel', 'default').

return [
    'app_env' => getenv('APP_ENV') ?: 'production',
    'api_key' => getenv('API_KEY') ?: null,
];

Middleware

Klasse in classes/Middleware/. Methode handle(Request $request, callable $next). Entweder redirect(...) oder return $next($request).

Hilfs-Funktionen (global)

view(), redirect(), json(), response(), baseUrl(), path() – alle in vendor/.../src/helper.php definiert, automatisch geladen.

Datenbank

Kein Schema nötig. Beim ersten insert() wird data/<table>.json automatisch angelegt. Felder ergeben sich aus dem eingefügten Array. IDs werden automatisch vergeben (integer, fortlaufend).