The procedural PHP micro framework

dev-main 2025-01-18 20:12 UTC

This package is auto-updated.

Last update: 2025-06-18 20:58:55 UTC


README

The procedural PHP micro framework.

Features

Installation

Atom requires PHP >= 8.2

composer require dbarcinas/atom

Configuration

use function atom\config;

// Set config
config('app.name', 'Atom');
config('foo', 'bar');

// Get config
$name = config('app.name');
echo $name; // 'Atom'

// Retrieve all config
$config = config();
print_r($config);

// Prints out
[
    'app' => [
        'name' => 'Atom',
    ],
    'foo' => 'bar'
]

// Configuration can be retrieved using dot notation
echo config('foo'); // 'bar'
echo config('app.name') // 'Atom'

Routing

Basic Usage

use function atom\{dispatch, route, url_for};

// Basic route
route('GET', '/foo', function () {
    // ...
});

// Multiple methods
route(['GET', 'POST'], '/bar', function () {
    // ...
});

// Route names
// Method verbs can be lowercased
route(['put'], '/baz', function () {
    // ...
}, '@baz');

route('get', '/qux', function () {
    echo url_for('@baz'); // prints '/baz'
});

// Dispatch
dispatch();

Route Parameters

route('GET', '/foo/{id}', function ($id) {
    echo "ID: $id";
});

// Parameter types
route('POST', '/foo/bar/{id:int}, function ($id) {
    echo "POST ID: $id";
});

Middlewares

// Auth middleware
function auth(string $request, string $method, array $params): bool {
    if ($params['id'] > 1) {
        return false;
    }
    // Must return boolean
    return true;
}

route('get', '/foo/{id:int}', function ($id) {
    // ...
}, '@foo', 'auth');

// Multiple middlewares
route('get', '/bar', function () {
    // ...
}, '@bar', ['auth', 'logger']);

Route Groups

use function atom\{dispatch, stack};

// Grouping routes in atom are called stacks
// $route is delegated to 'route(...)'
stack('/api/user', function ($route) {
    $route('GET', '/{id:int}' function ($id) {
        // Maps to '/api/user/1'
        // ...
    });

    // Middleware example
    $route(['GET', 'POST'], '/feed', function () {
        // Maps to '/api/user/feed'
        // ...
    }, '@api.user.feed', ['auth']);
});

// Middleware
stack('/dashboard', function ($route) {
    // ...
}, ['auth', 'logger']);

dispatch();

Custom 404 Page

use function atom\{route, dispatch};

// Routes
// route(...);
// route(...);

// Dispatch with a custom error handler
dispatch(function ($request, $method) {
    echo '404 Not Found.';
});

Note: Routes are automatically cached for faster response and improved performance speed.

Templates

Basic Usage

use function atom\{config, dispatch, route, render}

// Set templates path
config('templates.path', __DIR__ . '/../templates');

route('get', '/foo', function () {
    // '.php' extension is optional
    render('foo', [
        'bar' => 'baz',
    ]);
});

dispatch();

// /templates/foo.php
<div>
  <h1>foo <?= $bar ?></h1>
</div>

Layouts

// /templates/layout.php
<html>
  <head>
    <title><?php atom\yields('title', 'Default'); ?></title>
  </head>
  <main>
    <?php atom\yields('content'); ?>
  </main>
</html>

// /templates/foo.php
<?php atom\layout('layout'); ?>

<?php atom\section('title') ?>
  Foo
<?php atom\end_section(); ?>

<?php atom\section('content') ?>
  <p><?= $punch_line; ?></p>
<?php atom\end_section(); ?>

// App
route('get', '/foo', function () {
    render('foo', [
        'punch_line' => 'Atom against the mainstream!',
    ]);
});

dispatch();

Caching

By default, templates are cached. If your in development mode, it's best to disable this.

// Setting template cache path
config('templates.cache_path', __DIR__ . '/../cache');

// Disable cache
config('templates.debug', true);

Inertia

Inertia support is currently a work in progress. Check out the development branch!

Running Tests

To run tests, run the following command

composer test

License

MIT