PHPAML Framework
HTTP, routing, MVC, middleware, injection, validation, and security with an explicit request lifecycle.
Framework, View, Engine, Data, and i18n remain independently usable. Combine only the capabilities your application needs instead of adopting the whole platform.
HTTP, routing, MVC, middleware, injection, validation, and security with an explicit request lifecycle.
Declarative pages, components, layouts, reactive state, computed properties, and effects.
Events, collections, and client navigation without full reloads or handwritten JavaScript.
Typed entities, queries, relations, migrations, and SQL or MongoDB transactions.
JSON catalogs, parameters, plurals, locale resolution, and fallbacks.
final class MovieRoute extends Route
{
protected string $prefix = '/api/v1';
protected function routes(): void
{
$this->get('/movies', [MovieController::class, 'index']);
$this->get('/movies/{id}', [MovieController::class, 'show']);
}
}final class Counter extends Page
{
#[State] public int $count = 0;
public function body(): View
{
return VStack(
Heading('AML View')->size(42),
Text(StateRef::to('count', $this->count)),
Button('Add one')->onClick(
ClientAction::increment('count')
)
)->gap(16);
}
}#[Effect(
dependencies: ['query'],
debounce: 300,
concurrency: 'latest'
)]
protected function search(): EffectPlan
{
return Effects::run(
ClientAction::set('loading', true)
);
}
Button('Account')->onClick(
Navigate('/account')
);$users = $db->users()
->where('active', '=', true)
->orderBy('name')
->limit(20)
->all();
$db->transaction(function ($db) use ($lesson) {
$db->lessons()->add($lesson);
$db->saveChanges();
});aml install i18n
aml i18n:add fr
// src/locales/fr/navigation.json
{
"account": "Mon compte",
"lessons": "Mes leçons"
}
Text(__('navigation.account'));