jostar / beach
Yet another minimal PHP Framework
Requires
- php: >=8.0
- vlucas/phpdotenv: ^5.6
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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/
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).