Download the PHP package astral-php/astral without Composer
On this page you can find all versions of the php package astral-php/astral. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download astral-php/astral
More information about astral-php/astral
Files in astral-php/astral
Package astral
Short Description Astral MVC — Framework PHP 8.1+ minimaliste, moderne et orienté objet
License MIT
Homepage https://github.com/astral-php/astral
Informations about the package astral
Astral MVC — Framework PHP 8.1+ minimaliste
Micro-framework MVC orienté objet, compatible PHP 8.1 → 8.5.
Dépendances de production : vlucas/phpdotenv, phpmailer/phpmailer.
Minimaliste par design, puissant par convention.
Prérequis : PHP ≥ 8.1 (recommandé : 8.2+ / 8.3+ / 8.4 / 8.5).
Écosystème Composer
Trois familles (détail : astral.md) :
| Famille | Commande | Exemples |
|---|---|---|
| Application | composer create-project |
astral-php/astral ; futur astral-blog, astral-shop |
| Core | dépendance Composer | astral-php/astral-core 1.2.3 |
| Composant | composer require |
form, vite, utilities, template, auth-extra… |
Composants optionnels
| Package | Rôle | Statut |
|---|---|---|
astral-php/astral-form |
Formulaires (FormBuilder, erreurs Validator, variable $form dans les vues) |
Packagist · GitHub |
astral-php/astral-vite |
Assets Vite + Tailwind, $vite->tags() dans le layout |
Packagist · GitHub |
astral-php/astral-utilities |
Helpers Str / Date / Arr (zéro dépendance) |
Packagist · GitHub |
astral-php/astral-template |
Layouts Tailwind admin / marketing + partials UI | Packagist · GitHub |
astral-php/astral-auth-extra |
Throttling login, remember-me, journal des tentatives | Packagist · GitHub |
astral-php/astral-extend-orm |
Modèles enrichis (fillable, casts, accessors, relations) | En cours (remaniement) → 1.3 |
astral-php/astral-payment |
Paiements Stripe (checkout, webhooks) | En cours (repackaging) → 1.3 |
Applications
| Package | Rôle | Statut |
|---|---|---|
astral-php/astral |
Starter MVC | ✅ 1.2.3 (require astral-core) |
astral-php/astral-blog |
Blog / CMS clé en main | MVP local 0.3 — create-project après astral-core 1.2.3 |
Puis enregistrer le ServiceProvider du package dans config/dependencies.php (voir le README de chaque dépôt).
Roadmap : 1.2.3 = extraction
astral-core; ensuite blog en application, puis extend-orm / payment.
Le core 2.x (enums, readonly, PHP 8.2+) est un chantier séparé.
Organisation : Packagist astral-php · GitHub astral-php.
Structure
Installation
Prérequis : PHP 8.1 ou supérieur (8.1 → 8.5).
Via Composer (recommandé)
Crée un projet à partir de la branche 1.2.x (actuelle : 1.2.3) :
Pour figer exactement la 1.2.3 :
Dépend de astral-php/astral-core ^1.2.
Depuis un clone Git
Vérifiez notamment APP_DEBUG=true en développement (pages d'erreur détaillées + dump()).
Démarrage rapide (Laragon / Apache)
- Créer le projet (
create-projectou clone) danslaragon/www/(ex.mon-projet) - Accéder à
http://mon-projet.testouhttp://localhost/mon-projet - La base SQLite et le dossier
storage/logs/sont créés automatiquement
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
2. Contrôleurs API d'exemple
3. Migrations d'exemple
4. Nettoyer AppServiceProvider
Dans app/Providers/AppServiceProvider.php, retirez :
5. Nettoyer config/routes.php
Retirez le groupe /api/v1 et ses imports :
Note : Les middlewares
CorsMiddlewareetBearerTokenMiddleware, ainsi que la classeApiResponseetAbstractApiController, font partie du framework (astral-php/astral-core) — vous pouvez les réutiliser pour vos propres modules API sans les supprimer.
Variables d'environnement (.env)
Copiez .env.example en .env et adaptez les valeurs. Le fichier .env
ne doit jamais être versionné (déjà dans .gitignore).
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
| Fichier à modifier | Quand |
|---|---|
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.phpn'est jamais modifié par l'application. Les providers cœur (FrameworkServiceProvider) ne le sont que pour étendre le framework lui-même.
Fonctionnalités
Debug & erreurs (ErrorHandler, dump, dd)
Zéro dépendance. Activé automatiquement au démarrage.
| Situation | Comportement |
|---|---|
NotFoundException |
Page 404 (HTML) — pas de log |
AuthorizationException / CsrfException |
Page 403 (CSRF logué en warning) |
Autre Throwable |
Log ERROR + page 500 |
| Erreurs PHP / fatals | Converties / capturées → 500 |
Routes /api/* |
Réponses JSON (ApiResponse) — hors rendu HTML |
Avec APP_DEBUG=true, la page 500 affiche classe, message, fichier et stack trace.
Avec APP_DEBUG=false, message générique uniquement (aucun détail technique exposé).
Session & Messages flash
Validation
Règles disponibles :
| Règle | Description |
|---|---|
required |
Champ non vide |
min:N |
Longueur ≥ N (chaîne) ou valeur ≥ N (nombre) |
max:N |
Longueur ≤ N (chaîne) ou valeur ≤ N (nombre) |
email |
Adresse e-mail valide |
integer |
Entier |
numeric |
Valeur numérique |
alpha |
Lettres uniquement |
url |
URL valide |
confirmed |
Doit correspondre au champ {field}_confirmation |
in:a,b,c |
Valeur parmi la liste |
Protection CSRF
Le token est partagé automatiquement dans toutes les vues via $csrf.
La vérification se fait via CsrfMiddleware à appliquer aux routes concernées :
Partials (vues réutilisables)
Le moteur de vues expose renderPartial() et un alias court partial() pour inclure des sous-vues (sans layout). La variable $viewEngine est partagée dans toutes les vues et le layout (nom dédié pour éviter tout conflit avec une donnée view), ce qui permet d’inclure des partials depuis n’importe quel template.
Convention : placer les partials dans views/partials/ (ex. partials/flash.php, partials/field-error.php).
Depuis une vue ou le layout :
Partials fournis (Tailwind CSS) :
| Partial | Rôle | Variables |
|---|---|---|
partials/flash |
Messages flash success/error | $session (partagée) |
partials/validation-errors |
Liste globale d’erreurs de validation | $errors (optionnel) |
partials/field-error |
Message d’erreur sous un champ | $field, $errors |
partials/pagination |
Liens Précédent / numéros / Suivant | $current, $pages, $baseUrl, $mode (optionnel) |
Pagination — 3 modes ($mode optionnel, défaut numbers) : simple (Précédent / Suivant), numbers (toutes les pages), elastic (fenêtre glissante 1 … 5 6 7 … 42 pour gros volumes).
En contrôleur, $this->view->renderPartial('nom/vue', $data) retourne le HTML sans layout (utile pour des réponses AJAX ou fragments). Dans les vues, utilisez toujours $viewEngine->partial(...) pour inclure un partial.
Middleware
Créer un middleware dans app/Middleware/ :
Enregistrer dans config/dependencies.php :
Appliquer dans config/routes.php :
Routes — verbes HTTP complets & groupes
Logger
Les erreurs 500 sont loguées automatiquement dans storage/logs/YYYY-MM-DD.log.
Format d'une ligne de log :
Pagination
Objet Response (actions testables)
Les méthodes render(), redirect() et json() retournent désormais
des objets Response. L'envoi HTTP n'est déclenché qu'à la fin par le Router,
ce qui permet de tester les contrôleurs sans sortie réelle.
Cache fichier
Console CLI
Ajouter une commande applicative :
Service Providers
config/dependencies.php déclare un tableau de providers — plus de Closure plate.
Application instancie chaque provider et appelle register() dans l'ordre du tableau.
Ajouter un groupe de services (ex: envoi d'e-mails) :
Les providers du framework (
astral-core→Core\Providers\) ne sont jamais modifiés. Vos ajouts se font exclusivement dansapp/Providers/.
JSON / API REST
Basculer vers MySQL
Éditer .env (recommandé) :
Relations entre entités — ORM léger
Philosophie Astral : pas de lazy-loading, pas de magie. Les relations sont des appels explicites dans les DAOs.
AbstractDao expose deux helpers protected que les DAOs concrets peuvent appeler :
hasMany() — relation 1→N
belongsTo() — relation N→1
Chargement combiné
Les DAOs exposent des méthodes de "chargement avec relation" pour éviter de multiples appels :
Exemple complet : module Article
Règles et conventions
| Règle | Raison |
|---|---|
| Pas de lazy-loading | Rend les requêtes visibles et prévisibles |
Méthodes nommées <entité>Of($parent) |
Ex: articlesOf($categoryId), categoryOf($article) |
belongsTo retourne null si foreignId = 0 |
Sécurité si la clé étrangère est nulle |
findWith*() pour chargement combiné |
Pratique pour les contrôleurs |
Migrations fournies
Authentification & Rôles
Le premier compte créé via /register devient automatiquement admin.
Ensuite, l’admin paramètre l’inscription des utilisateurs suivants dans le .env :
Rôles disponibles
Service Auth
Disponible dans tous les contrôleurs via le conteneur, et dans toutes les vues
via la variable $auth partagée automatiquement.
Middleware Auth
Trois middleware intégrés, utilisables dans config/routes.php :
| Middleware | Comportement |
|---|---|
AuthMiddleware |
Redirige vers /login si non connecté |
AdminMiddleware |
Redirige vers /login si non connecté ; lève AuthorizationException (403) si non admin |
GuestMiddleware |
Redirige vers / si déjà connecté (pour /login, /register) |
Gestion des rôles dans UserDao
Interface d'administration des rôles
L'application embarque une interface dédiée accessible aux administrateurs :
| Méthode | URI | Action | Middleware |
|---|---|---|---|
| GET | /admin/users |
Tableau de bord des rôles | AdminMiddleware |
| POST | /admin/users/:id/role |
Changer le rôle d'un utilisateur | AdminMiddleware |
Contrôleur : App\Controllers\Admin\UserController
Règles de sécurité intégrées :
- Un admin ne peut pas modifier son propre rôle.
- Le dernier administrateur ne peut pas être rétrogradé (protection anti-lockout).
- Seuls les rôles définis dans
Role::all()sont acceptés.
Événement dispatché après chaque changement :
Listener fourni : App\Listeners\LogRoleChange — journalise l'action via Logger.
Modèle User — helpers de rôle
Routes d'authentification (incluses par défaut)
| Méthode | URI | Action | Middleware |
|---|---|---|---|
| GET | /login |
Formulaire de connexion | GuestMiddleware |
| POST | /login |
Traitement de connexion | GuestMiddleware |
| POST | /logout |
Déconnexion | — |
| GET | /register |
Formulaire d'inscription | GuestMiddleware |
| POST | /register |
Traitement d'inscription | GuestMiddleware |
Routes disponibles (application de démonstration)
| Méthode | URI | Action | Middleware |
|---|---|---|---|
| GET | / |
Page d'accueil | — |
| GET | /login |
Formulaire de connexion | GuestMiddleware |
| POST | /login |
Traitement connexion | GuestMiddleware |
| POST | /logout |
Déconnexion | — |
| GET | /register |
Formulaire d'inscription | GuestMiddleware |
| POST | /register |
Inscription | GuestMiddleware |
| GET | /users |
Liste des utilisateurs | AuthMiddleware |
| GET | /users/create |
Formulaire de création | AuthMiddleware |
| GET | /users/:id |
Fiche d'un utilisateur | AuthMiddleware |
| POST | /users |
Créer un utilisateur | AuthMiddleware |
| POST | /users/:id/delete |
Supprimer un utilisateur | AuthMiddleware |
Tests
Couverture actuelle :
| Fichier | Ce qui est testé |
|---|---|
tests/Core/ValidatorTest.php |
10 règles de validation, combinaisons, errors()/first() |
tests/Core/ContainerTest.php |
bind, singleton, instance, has, make, autowiring |
tests/Core/RequestTest.php |
Méthode HTTP, verb spoofing, URI, input()/query()/header() |
tests/Core/SessionTest.php |
get/set/has/forget, flash messages, pullAllFlashes |
tests/Core/CacheTest.php |
get/set/has/forget/flush, remember(), expiration TTL |
tests/Core/Http/ResponseTest.php |
Response, JsonResponse, RedirectResponse |
tests/Core/EventDispatcherTest.php |
listen, dispatch, subscribe, hasListeners, ordre, exceptions |
tests/Core/RouterTest.php |
Route statique, route non trouvée |
tests/Database/AbstractDaoTest.php |
Insert, findAll, update, delete, authenticate |
tests/Database/MigratorTest.php |
run, rollback, status, batches, orphan detection |
Events & Listeners
Le système d'événements découple les effets de bord des contrôleurs.
EventDispatcher est synchrone et zéro dépendance.
Créer un événement
Créer un listener
Enregistrer dans AppServiceProvider
Dispatcher depuis un contrôleur
Subscriber (regroupement de listeners)
Événements fournis
| Événement | Déclenché par | Listeners actifs |
|---|---|---|
UserRegistered |
AuthController::register() |
SendWelcomeEmail, LogUserActivity |
UserLoggedIn |
AuthController::login() |
LogUserActivity |
Migrations de base de données
Le système de migrations versionne le schéma de base de données via des fichiers PHP
dans database/migrations/. Chaque migration est un batch identifié en base dans la
table migrations (créée automatiquement, SQLite et MySQL compatibles).
Convention de nommage
Commandes
Anatomie d'un fichier de migration
Résultat de migrate:status
| Statut | Signification |
|---|---|
applied |
Migration exécutée en base |
pending |
Fichier présent, pas encore appliqué |
orphan |
Enregistrement en base mais fichier supprimé |
API REST JSON
Astral embarque une couche API complète, activée via des routes /api/v1/* protégées par CORS et Bearer Token.
Format de réponse uniforme
Configuration
Dans .env :
Appels depuis un client
Routes disponibles
| Méthode | URI | Action |
|---|---|---|
| GET | /api/v1/articles |
Liste paginée (?page=N&status=published) |
| GET | /api/v1/articles/:id |
Détail + catégorie liée |
| POST | /api/v1/articles |
Créer (JSON body) |
| PUT | /api/v1/articles/:id |
Modifier (JSON body partiel) |
| DELETE | /api/v1/articles/:id |
Supprimer → 204 |
| GET | /api/v1/categories |
Liste toutes les catégories |
| GET | /api/v1/categories/:id |
Détail (?with_articles=1) |
Créer un contrôleur API
Middlewares
| Middleware | Rôle |
|---|---|
CorsMiddleware |
En-têtes Access-Control-*, gestion des requêtes OPTIONS preflight |
BearerTokenMiddleware |
Vérifie Authorization: Bearer <token> vs API_KEY |
Scaffolding — Générateur de code
Le générateur crée automatiquement le squelette d'un module complet (Model, DAO, Controller, Migration).
Mode interactif (recommandé)
Le prompt guide étape par étape :
Mode direct
Ce que génère chaque commande
| Commande | Fichier généré | Description |
|---|---|---|
make:model Article |
app/Models/Article.php |
Modèle anémique avec propriétés typées |
make:dao Article |
app/Dao/ArticleDao.php |
DAO héritant d'AbstractDao, table auto-détectée |
make:controller Article --resource |
app/Controllers/ArticleController.php |
7 actions CRUD (index, show, create, store, edit, update, destroy) |
make:controller Article --api |
app/Controllers/ArticleController.php |
5 actions JSON avec validation et codes HTTP |
make:migration create_articles_table |
database/migrations/…php |
Migration SQLite + MySQL |
Après la génération — étapes manuelles
public/index.phpetCore\Application(packageastral-core) ne sont jamais modifiés.
Fonctionnalités PHP 8.1+ utilisées
declare(strict_types=1)partout- Constructor Property Promotion + propriétés
readonly(ex.ErrorHandler) - Named Arguments (
findAll(orderBy: 'name')) matchexpression- Union types (
string|array) - First-class callables (
$this->handleError(...)) str_contains(),str_starts_with()fn()arrow functionsmixedtype hintneverreturn type (dd())