aina / dagophp
Framework PHP minimaliste : routing, MVC, ORM basique, migrations, envoi d'email SMTP, écrit à la main sans dépendance lourde.
Requires
- php: >=8.1
- ext-pdo: *
- symfony/yaml: ^8.1
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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); } }