Search by

aina / dagophp

ramiandry

Framework PHP minimaliste : routing, MVC, ORM basique, migrations, envoi d'email SMTP, écrit à la main sans dépendance lourde.

Package info

github.com/ramiandry/dagophp

Type:project

pkg:composer/aina/dagophp

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-08-21 10:46 UTC

This package is not auto-updated.

Last update: 2026-11-14 11:15:29 UTC


README

Framework PHP minimaliste, sans dépendance lourde — routing, MVC, ORM basique, migrations, envoi d'email en SMTP brut, le tout dans quelques centaines de lignes lisibles.

Prérequis

  • PHP 8.1+
  • Composer
  • MySQL / MariaDB

Installation

Nouveau projet (une fois publié sur Packagist) :

composer create-project aina/dagophp mon-projet

Depuis ce dépôt en local :

composer install

Dans les deux cas, config/*.yaml.example est automatiquement copié vers config/*.yaml (script post-create-project-cmd). Si tu es en composer install local et que ces fichiers n'existent pas encore, copie-les à la main :

cp config/app.yaml.example config/app.yaml
cp config/database.yaml.example config/database.yaml
cp config/mail.yaml.example config/mail.yaml

Les fichiers config/*.yaml réels sont ignorés par git (.gitignore) — seuls les .example sont versionnés, pour ne jamais commiter de vrais identifiants.

Configure ensuite tes accès dans config/database.yaml et config/mail.yaml, puis lance les migrations :

php dago migrate

Démarre le serveur de développement :

php dago serve
php dago serve -p 8080   # port personnalisé

Structure du projet

app/
├── Controllers/     # Contrôleurs applicatifs (App\Controllers\)
├── Models/          # Modèles (App\Models\)
└── Middlewares/     # Middlewares (App\Middlewares\)

config/
├── app.yaml         # nom, mode debug, clé secrète
├── database.yaml     # connexion MySQL
└── mail.yaml         # connexion SMTP

database/
└── migrations/       # une migration = un fichier PHP qui `return` du SQL

public/
└── index.php          # front controller

resources/
└── views/             # templates PHP (layout + vues)

routes/
├── web.php            # charge automatiquement tous les autres fichiers du dossier
└── *.php              # un fichier de routes par domaine (home.php, product.php...)

src/                    # cœur du framework (namespace Dago\)
├── App.php             # bootstrap
├── Router.php           # routing + middlewares
├── Request.php / Response.php
├── Controller.php / View.php
├── Database.php / Model.php
├── Middleware.php        # interface
├── Validator.php
├── Config.php            # lecture des fichiers config/*.yaml
├── Mail.php               # client SMTP fait maison
└── Console.php            # commandes CLI (php dago ...)

dago                       # point d'entrée CLI

Routing

routes/web.php ne contient plus de routes lui-même : il boucle sur tous les .php du dossier routes/ et les charge. Pour ajouter un groupe de routes, crée un nouveau fichier (ou utilise php dago makeroute nom) :

<?php

use Dago\Router;

/** @var Router $router */

$router->get('/', 'HomeController@index');
$router->get('/user/{id}', 'UserController@show');
$router->post('/user', 'UserController@store');

// avec middleware
$router->get('/dashboard', 'DashboardController@index', [\App\Middlewares\AuthMiddleware::class]);

// closure directe
$router->get('/ping', function (\Dago\Request $request) {
    return (new \Dago\Response())->json(['pong' => true]);
});

Contrôleurs

namespace App\Controllers;

use Dago\Controller;
use Dago\Request;
use Dago\Response;

class UserController extends Controller
{
    public function show(Request $request): Response
    {
        $id = $request->param('id');

        return $this->view('user', ['id' => $id]);
        // ou : return $this->json(['id' => $id]);
        // ou : return $this->redirect('/');
    }
}

Vues

<?php $view->layout('layout'); ?>

<h1><?= $view->e($title) ?></h1>

$view->e() échappe le HTML (protection XSS). $view->layout('nom') enrobe la vue dans resources/views/nom.php, dont le contenu est disponible via $content.

Modèles

namespace App\Models;

use Dago\Model;

class User extends Model
{
    protected static string $table = 'users';
}
User::all();
User::find(1);
User::where('email', 'a@b.com');
User::create(['name' => 'Aina', 'email' => 'a@b.com']);

Validation

$validator = new \Dago\Validator();
$errors = $validator->validate($request->all(), [
    'email' => 'required|email',
    'password' => 'required|min:8',
]);

if ($validator->fails()) {
    return $this->json(['errors' => $errors], 422);
}

Email (SMTP brut, sans librairie)

(new \Dago\Mail())->send(
    'destinataire@test.com',
    'Sujet du mail',
    '<p>Corps du message en HTML</p>'
);

Configuration dans config/mail.yaml (host, port, encryption, username, password, from, from_name).

Commandes CLI (php dago ...)

Commande Description
php dago migrate Exécute toutes les migrations de database/migrations/
php dago makemigrations nom Crée une nouvelle migration horodatée
php dago makemodel Nom Crée app/Models/Nom.php
php dago makecontroller Nom Crée app/Controllers/NomController.php
php dago makeroute nom Crée routes/nom.php
php dago serve / php dago serve -p 8080 Démarre le serveur de dev (port 8000 par défaut)

Middlewares

namespace App\Middlewares;

use Dago\Middleware;
use Dago\Request;
use Dago\Response;

class AuthMiddleware implements Middleware
{
    public function handle(Request $request, \Closure $next): Response
    {
        if (!isset($_SESSION['user_id'])) {
            return (new Response())->redirect('/login');
        }

        return $next($request);
    }
}