A lightweight, educational PHP framework with service container, routing, ORM, migrations, and more.
Caution
This framework is NOT PRODUCTION READY. This is a limited feature framework intended as a learning tool/playground for developers.
- π― Service Container - Dependency injection and service management
- π£οΈ Routing - Clean, simple routing with middleware support
- ποΈ ORM - Active Record style ORM with relationships (hasOne, hasMany, belongsTo, belongsToMany)
- π Migrations - Database version control and schema management
- π¨ Views - Simple templating engine with blade-like syntax
- π Authentication - Built-in authentication helpers
- π§ͺ Testing - PHPUnit test suite included
- β‘ CLI Tools - Built-in console commands for common tasks
- PHP 8.0+
- PDO extension
- SQLite, MySQL, or PostgreSQL support
The easiest way to get started is to use the project skeleton:
composer create-project baremetalphp/baremetalphp [your-project]
cd [your-project]
php mini migrate
php mini serveNote: The framework defaults to a SQLite database, but you can set up a MySQL connection in
.env(PostgreSQL is ~95% functional but not fully tested).
- Require the framework:
composer require elliotanderson/phpframework- Set up your application structure:
my-app/
βββ app/
β βββ Http/
β β βββ Controllers/
β βββ Models/
βββ bootstrap/
β βββ app.php
βββ config/
β βββ database.php
βββ public/
β βββ index.php
βββ routes/
β βββ web.php
βββ composer.json
- Create a route (
routes/web.php):
use BareMetalPHP\Routing\Router;
use BareMetalPHP\Http\Response;
return function (Router $router): void {
$router->get('/', function () {
return new Response('Hello, World!');
});
};- Bootstrap your application (
bootstrap/app.php):
<?php
require __DIR__ . '/../vendor/autoload.php';
use BareMetalPHP\Application;
$app = new Application(__DIR__ . '/..');
$app->registerProviders([
BareMetalPHP\Providers\ConfigServiceProvider::class,
BareMetalPHP\Providers\DatabaseServiceProvider::class,
BareMetalPHP\Providers\RoutingServiceProvider::class,
BareMetalPHP\Providers\ViewServiceProvider::class,
]);
return $app;- Create your entry point (
public/index.php):
<?php
$app = require __DIR__ . '/../bootstrap/app.php';
$app->run();$router->get('/users', [UserController::class, 'index']);
$router->post('/users', [UserController::class, 'store']);
$router->get('/users/{id}', [UserController::class, 'show']);use BareMetalPHP\Database\Model;
class User extends Model
{
protected $table = 'users';
// Relationships
public function posts()
{
return $this->hasMany(Post::class);
}
}
// Usage
$user = User::find(1);
$posts = $user->posts;use BareMetalPHP\Database\Migration;
class CreateUsersTable extends Migration
{
public function up($connection)
{
$this->createTable($connection, 'users', function ($table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamps();
});
}
public function down($connection)
{
$this->dropTable($connection, 'users');
}
}use BareMetalPHP\View\View;
return View::make('welcome', [
'name' => 'World'
]);The framework includes a CLI tool (mini) with several commands:
php mini serve- Start the development serverphp mini migrate- Run pending migrationsphp mini migrate:rollback- Rollback the last migrationphp mini make:controller Name- Create a new controllerphp mini make:migration name- Create a new migration
composer test
# or
vendor/bin/phpunitFor detailed documentation, visit the framework documentation.
MIT License - see LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.