PHPackages                             astral-php/astral - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. astral-php/astral

ActiveProject[Framework](/categories/framework)

astral-php/astral
=================

Astral MVC — Framework PHP 8.x minimaliste, moderne et orienté objet

1.1.2(2mo ago)0711MITPHPPHP ^8.0

Since Mar 14Pushed 2mo agoCompare

[ Source](https://github.com/astral-php/astral)[ Packagist](https://packagist.org/packages/astral-php/astral)[ RSS](/packages/astral-php-astral/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (6)Versions (5)Used By (1)

Astral MVC — Framework PHP 8.x minimaliste
==========================================

[](#astral-mvc--framework-php-8x-minimaliste)

[![PHP](https://camo.githubusercontent.com/efc33820eea622b7119e4e8f304c3622be923425eb8ee1d34c7b42dbe2c2e847/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e302532422d3737374242343f6c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://www.php.net)[![Version](https://camo.githubusercontent.com/c006a02e4da7ba88aa6e912519176bcefee0d11fa8b798cb61a704ecd5dd8c78/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e312e322d626c7565)](CHANGELOG.md)[![License: MIT](https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667)](LICENSE)[![Tests](https://camo.githubusercontent.com/79e32a45807d3c0f658f90fade960efdd910a31f3dc311fb520726aea78e5388/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d504850556e6974253230392e362d393933334343)](phpunit.xml)

Micro-framework MVC orienté objet, compatible PHP 8.0 → 8.4. Dépendances de production : `vlucas/phpdotenv`, `phpmailer/phpmailer`. Minimaliste par design, puissant par convention.

---

Écosystème Composer (optionnel)
-------------------------------

[](#écosystème-composer-optionnel)

Des **packages officiels** complètent le cœur du framework sans l’alourdir. Ils s’installent uniquement si tu en as besoin.

PackageRôleDépôt`astral-php/astral-form`Formulaires (`FormBuilder`, erreurs `Validator`, variable `$form` dans les vues)[astral-php/astral-form](https://github.com/astral-php/astral-form)`astral-php/astral-vite`Assets Vite + Tailwind, `$vite->tags()` dans le layout[astral-php/astral-vite](https://github.com/astral-php/astral-vite)Organisation GitHub : [github.com/astral-php](https://github.com/astral-php).

---

Structure
---------

[](#structure)

```
astral-mvc/
├── app/
│   ├── Controllers/        # Contrôleurs applicatifs (AuthController, UserController…)
│   ├── Dao/                # Data Access Objects métier
│   ├── Events/             # Événements applicatifs (UserRegistered, UserLoggedIn…)
│   ├── Listeners/          # Listeners d'événements (SendWelcomeEmail, LogUserActivity…)
│   ├── Models/             # Entités / modèles de données (User…)
│   └── Providers/
│       └── AppServiceProvider.php   # ← DAOs + contrôleurs + listeners applicatifs
├── config/
│   ├── app.php             # Config générale (env, debug, timezone…)
│   ├── database.php        # Basculer SQLite ↔ MySQL ici
│   ├── dependencies.php    # ← Liste des Service Providers
│   └── routes.php          # ← Déclaration de toutes les routes
├── database/
│   └── migrations/         # Fichiers de migration (YYYY_MM_DD_HHMMSS_nom.php)
├── public/
│   ├── .htaccess           # Réécriture Apache
│   └── index.php           # Bootstrap minimal (ne pas modifier)
├── src/
│   ├── Core/
│   │   ├── Application.php        # Chef d'orchestre du démarrage
│   │   ├── Cache.php              # Cache fichier (TTL, remember, flush)
│   │   ├── ServiceProviderInterface.php  # Contrat des providers
│   │   ├── Providers/
│   │   │   ├── FrameworkServiceProvider.php  # Session, Logger, Cache, View…
│   │   │   └── DatabaseServiceProvider.php   # PDO
│   │   ├── Container.php          # Conteneur DI (autowiring + singletons)
│   │   ├── CsrfGuard.php          # Protection CSRF (token de session)
│   │   ├── Logger.php             # Logger fichier journalier
│   │   ├── Mailer/
│   │   │   └── Mailer.php         # Envoi e-mail (SMTP via PHPMailer)
│   │   ├── Request.php            # Requête HTTP (JSON, verb spoofing)
│   │   ├── Router.php             # Routeur (routes + middleware + groupes)
│   │   ├── Session.php            # Session + messages flash
│   │   ├── Validator.php          # Validation des données
│   │   ├── View.php               # Moteur de rendu → retourne string
│   │   ├── Console/
│   │   │   ├── CommandInterface.php
│   │   │   ├── Console.php        # Dispatcher + helpers ANSI
│   │   │   └── Commands/
│   │   │       ├── ClearCacheCommand.php
│   │   │       ├── MigrateCommand.php          # migrate
│   │   │       ├── MigrateRollbackCommand.php  # migrate:rollback
│   │   │       ├── MigrateStatusCommand.php    # migrate:status
│   │   │       └── MakeMigrationCommand.php    # make:migration
│   │   ├── Auth/
│   │   │   ├── Auth.php           # Service auth (login, logout, check, is, can)
│   │   │   ├── Role.php           # Constantes ADMIN | USER | GUEST
│   │   │   └── Middleware/
│   │   │       ├── AuthMiddleware.php   # Connecté ou → /login
│   │   │       ├── AdminMiddleware.php  # Admin ou → 403
│   │   │       └── GuestMiddleware.php  # Invité ou → /
│   │   ├── Exception/
│   │   │   ├── AuthorizationException.php  # 403
│   │   │   ├── CsrfException.php
│   │   │   ├── NotFoundException.php
│   │   │   └── ValidationException.php
│   │   ├── Http/
│   │   │   ├── Response.php       # Réponse HTML (testable)
│   │   │   ├── JsonResponse.php   # Réponse JSON
│   │   │   └── RedirectResponse.php
│   │   └── Middleware/
│   │       ├── CsrfMiddleware.php
│   │       └── MiddlewareInterface.php
│   ├── Controller/
│   │   └── AbstractController.php # render/redirect/json → Response
│   └── Database/
│       ├── AbstractDao.php        # CRUD générique PDO + pagination
│       ├── Connection.php         # Singleton PDO (SQLite / MySQL)
│       └── Migration/
│           ├── Migration.php      # Classe abstraite de base (up/down)
│           └── Migrator.php       # Moteur : run, rollback, status
├── bin/
│   └── console                    # Point d'entrée CLI
├── storage/
│   ├── cache/              # Cache fichier (auto-créé)
│   └── logs/               # Logs journaliers (auto-créé)
├── .env                    # Variables d'environnement (non versionné)
├── .env.example            # Template à copier
├── tests/                  # Tests PHPUnit
├── views/
│   ├── partials/          # Partials réutilisables (flash, field-error, pagination…)
│   ├── auth/               # login.php, register.php, forgot-password…
│   ├── docs/               # Documentation en ligne
│   ├── errors/             # Pages d'erreur (403, 404, 500)
│   ├── home/
│   ├── layout/             # Layout principal (Tailwind CDN)
│   ├── profile/
│   └── user/
├── composer.json
└── phpunit.xml

```

---

Installation
------------

[](#installation)

```
composer install
cp .env.example .env   # puis adaptez les valeurs
```

Démarrage rapide (Laragon / Apache)
-----------------------------------

[](#démarrage-rapide-laragon--apache)

1. Copier le projet dans `laragon/www/mvc/`
2. Accéder à `http://mvc.test` ou `http://localhost/mvc`
3. La base SQLite et le dossier `storage/logs/` sont créés automatiquement

---

Démarrer un projet from scratch
-------------------------------

[](#démarrer-un-projet-from-scratch)

Astral MVC est livré avec un module d'exemple complet (**Article / Category**) qui démontre les ORM léger (hasMany, belongsTo), l'API REST JSON et les migrations.

Si vous souhaitez repartir d'une **base vierge** pour construire votre propre application, supprimez les fichiers suivants :

### 1. Modèles et DAOs d'exemple

[](#1-modèles-et-daos-dexemple)

```
rm app/Models/Article.php
rm app/Models/Category.php
rm app/Dao/ArticleDao.php
rm app/Dao/CategoryDao.php
```

### 2. Contrôleurs API d'exemple

[](#2-contrôleurs-api-dexemple)

```
rm app/Controllers/Api/ArticleApiController.php
rm app/Controllers/Api/CategoryApiController.php
rmdir app/Controllers/Api   # si le dossier est vide
```

### 3. Migrations d'exemple

[](#3-migrations-dexemple)

```
rm database/migrations/2026_03_11_000002_create_categories_table.php
rm database/migrations/2026_03_11_000003_create_articles_table.php
```

### 4. Nettoyer `AppServiceProvider`

[](#4-nettoyer-appserviceprovider)

Dans `app/Providers/AppServiceProvider.php`, retirez :

```
// Imports à supprimer
use App\Controllers\Api\ArticleApiController;
use App\Controllers\Api\CategoryApiController;
use App\Dao\ArticleDao;
use App\Dao\CategoryDao;

// Bindings à supprimer (section DAOs)
$container->singleton(ArticleDao::class, ...);
$container->singleton(CategoryDao::class, ...);

// Bindings à supprimer (section Contrôleurs API)
$container->bind(ArticleApiController::class, ...);
$container->bind(CategoryApiController::class, ...);
```

### 5. Nettoyer `config/routes.php`

[](#5-nettoyer-configroutesphp)

Retirez le groupe `/api/v1` et ses imports :

```
// Imports à supprimer
use App\Controllers\Api\ArticleApiController;
use App\Controllers\Api\CategoryApiController;

// Groupe de routes à supprimer
$router->group('/api/v1', function (Router $r): void {
    $r->get('/articles', ...);
    // ...
}, [CorsMiddleware::class, BearerTokenMiddleware::class]);
```

> **Note :** Les middlewares `CorsMiddleware` et `BearerTokenMiddleware`, ainsi que la classe `ApiResponse` et `AbstractApiController`, font partie du **framework** (`src/Core/`) — vous pouvez les réutiliser pour vos propres modules API sans les supprimer.

---

Variables d'environnement (.env)
--------------------------------

[](#variables-denvironnement-env)

Copiez `.env.example` en `.env` et adaptez les valeurs. Le fichier `.env`**ne doit jamais être versionné** (déjà dans `.gitignore`).

```
APP_NAME="ASTRAL-MVC"
APP_ENV=development       # development | production
APP_DEBUG=true
APP_TIMEZONE=Europe/Paris

DB_DRIVER=sqlite
DB_DATABASE=database/app.sqlite

# MySQL
# DB_DRIVER=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=mvc_db
# DB_USERNAME=root
# DB_PASSWORD=
```

Les fichiers `config/app.php` et `config/database.php` lisent `$_ENV` avec des valeurs de fallback. En production, les variables peuvent aussi être injectées directement par le serveur (`.env` non requis).

---

Architecture du démarrage
-------------------------

[](#architecture-du-démarrage)

```
public/index.php
    └── Application::run()
            ├── loadDotEnv()        — charge .env via vlucas/phpdotenv
            ├── Logger              — disponible dès le début
            ├── bootEnvironment()   — timezone, affichage d'erreurs
            ├── ensureDatabase()    — crée le dossier SQLite si absent
            ├── loadDependencies()  ← config/dependencies.php
            ├── Session::start()    — avant tout rendu
            ├── View::share()       — $session et $csrf dans toutes les vues
            ├── loadRoutes()        ← config/routes.php
            └── dispatch()          — pipeline middleware → contrôleur
                                       → Response::send()

```

Fichier à modifierQuand`app/Providers/AppServiceProvider.php`Ajouter un DAO ou un contrôleur`config/dependencies.php`Ajouter / retirer un Service Provider`config/routes.php`Ajouter / modifier / supprimer une route`config/app.php`Changer l'environnement, le debug, la timezone`config/database.php`Changer de driver ou de base de données> `public/index.php`, `src/Core/Application.php` et les providers `src/Core/Providers/` ne sont **jamais** modifiés.

---

Fonctionnalités
---------------

[](#fonctionnalités)

### Session &amp; Messages flash

[](#session--messages-flash)

```
// Injecter Session dans un contrôleur
public function __construct(View $view, Session $session) { … }

// Enregistrer un message flash (avant redirect)
$this->session->flash('success', 'Utilisateur créé avec succès.');
$this->redirect('/users');

// Dans la vue suivante (lu une seule fois)
