PHPackages                             ironflow-framework/framework - 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. ironflow-framework/framework

ActiveLibrary[Framework](/categories/framework)

ironflow-framework/framework
============================

IronFlow — PHP 8.2+ HMVC Framework Core

v1.2.0(1mo ago)12↓80%MITPHPPHP &gt;=8.2

Since Jun 10Pushed 1mo agoCompare

[ Source](https://github.com/ironflow-framework/framework)[ Packagist](https://packagist.org/packages/ironflow-framework/framework)[ RSS](/packages/ironflow-framework-framework/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (9)Dependencies (33)Versions (11)Used By (0)

[![IronFlow](https://raw.githubusercontent.com/ironflow-framework/framework/main/.github/assets/logo.svg)](https://raw.githubusercontent.com/ironflow-framework/framework/main/.github/assets/logo.svg)`ironflow-framework/framework`
==============================

[](#ironflow-frameworkframework)

**Le cœur d'IronFlow — conteneur DI, routeur, ORM, modules HMVC, CLI.**

[![PHP 8.2+](https://camo.githubusercontent.com/6caa15003495643be73f70c6033009042189b7d38acf492a3d5fd04ffbb45059/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322532422d3737374242343f7374796c653d666c61742d737175617265266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://php.net)[![License MIT](https://camo.githubusercontent.com/a0f40b25b57c232bb2c7d20d4cf621e44e70ede534e3d87a2c906ea06dc0546f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d3232633535653f7374796c653d666c61742d737175617265)](LICENSE)![Version](https://camo.githubusercontent.com/f8681e11b5f4f89ee39f495db6c3c0cce66aa8d1139a23dec92f311406f060bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d302e312e302d3633363666313f7374796c653d666c61742d737175617265)[![Tests](https://camo.githubusercontent.com/dc87c4bd65130193f80b9e881ee5ccb750c025dcf0f465f9b03b320a6ab17977/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d70617373696e672d3232633535653f7374796c653d666c61742d737175617265266c6f676f3d6769746875622d616374696f6e73266c6f676f436f6c6f723d7768697465)](https://github.com/ironflow-framework/framework/actions)

[Installation](#installation) · [Architecture modulaire](#architecture-modulaire) · [Injection de dépendances](#injection-de-d%C3%A9pendances) · [Routing](#routing) · [ORM](#orm) · [CLI](#cli-forge) · [Contribuer](#contribuer)

---

Ce dépôt contient le **noyau du framework**. Il n'est pas destiné à être cloné directement pour démarrer un projet — utilise [`ironflow/skeleton`](https://github.com/ironflow-framework/skeleton) pour ça. Ce README documente l'architecture interne, les API publiques et les conventions à respecter pour y contribuer.

---

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

[](#installation)

Via le skeleton (recommandé) :

```
composer create-project ironflow/skeleton mon-app
```

Ou comme dépendance directe dans un projet existant :

```
composer require ironflow/framework
```

**Prérequis :** PHP 8.2+, Composer 2+, extensions `pdo`, `mbstring`, `json`.

---

Architecture modulaire
----------------------

[](#architecture-modulaire)

IronFlow organise le code en **modules HMVC isolés** avec dépendances déclaratives — inspiré de NestJS, porté en PHP idiomatique.

```
#[Module(
    name: 'blog',
    imports: ['auth'],                   // modules dont celui-ci dépend
    providers: [PostService::class],     // services internes
    exports: [PostService::class],       // API publique exposée aux autres modules
)]
class BlogModule extends BaseModule {}
```

### Règles d'isolation

[](#règles-disolation)

- Un provider est **privé par défaut** : inaccessible hors du module, sauf s'il est listé dans `exports`.
- Un module ne peut consommer que les providers **exportés** de ses dépendances déclarées dans `imports`.
- Les violations sont détectées **au démarrage**, pas à l'exécution.

### Graphe de dépendances

[](#graphe-de-dépendances)

Au boot, IronFlow construit un graphe orienté de tous les modules, valide l'absence de cycles (tri topologique) et détermine l'ordre d'initialisation. Inspecte-le :

```
php forge module:graph           # affichage ASCII
php forge module:graph --check   # retourne une erreur en cas de cycle (utile en CI)
```

### Scaffolding d'un module

[](#scaffolding-dun-module)

```
php forge make:module Blog
php forge make:controller PostController --module=Blog --resource
php forge make:model Post --module=Blog --migration --factory
```

---

Injection de dépendances
------------------------

[](#injection-de-dépendances)

Le conteneur résout les dépendances **par réflexion** sur les type hints. Aucune configuration manuelle nécessaire pour les cas courants.

```
#[Injectable]
class PostService
{
    public function __construct(
        private readonly PostRepository $posts,
        private readonly EventBus $events,
        #[Inject('config.app.name')] private readonly string $appName,
    ) {}
}
```

### Ce que supporte le conteneur

[](#ce-que-supporte-le-conteneur)

FonctionnalitéExempleAuto-résolution par type hint`PostRepository $posts`Injection de scalaires nommés`#[Inject('config.mail.from')]`Injection dans les méthodes de contrôleurs`public function show(Post $post, Request $request)`Singletons et liaisons explicites`$container->bind(MailerInterface::class, SmtpMailer::class)`Providers de moduledéfinis dans `providers: [...]` de `#[Module]`### Liaison manuelle

[](#liaison-manuelle)

```
// Dans un ServiceProvider ou un Module::register()
$this->container->bind(CacheInterface::class, RedisCache::class);
$this->container->singleton(Config::class, fn() => new Config(base_path('config')));
```

---

Routing
-------

[](#routing)

### Routes basiques

[](#routes-basiques)

```
Router::get('/posts/{id}', [PostController::class, 'show'])
    ->name('posts.show')
    ->middleware('auth')
    ->where('id', '[0-9]+');

Router::post('/posts', [PostController::class, 'store'])
    ->middleware(['auth', 'throttle:10,1']);
```

### Groupes et ressources

[](#groupes-et-ressources)

```
Router::group(['prefix' => '/api/v1', 'middleware' => ['throttle:60']], function () {
    Router::resource('posts', Api\PostController::class);         // 7 routes RESTful
    Router::resource('comments', Api\CommentController::class)->only(['index', 'store']);
});
```

### Routes nommées dans les templates

[](#routes-nommées-dans-les-templates)

```
Lire
```

### Inspection

[](#inspection)

```
php forge route:list
# +---------+----------------------------+------------------+-----------+
# | Method  | URI                        | Name             | Middleware|
# +---------+----------------------------+------------------+-----------+
# | GET     | /posts/{id}                | posts.show       | auth      |
# | POST    | /posts                     | posts.store      | auth,thro…|
# …
```

---

ORM
---

[](#orm)

Active Record sur `doctrine/dbal`. Pas de QueryBuilder exposé directement — passe par les modèles et les scopes.

### Modèle de base

[](#modèle-de-base)

```
class Post extends Model
{
    protected string $table = 'posts';

    protected array $casts = [
        'published_at' => 'datetime',
        'status'       => PostStatus::class,   // enum PHP 8.1+
        'metadata'     => 'json',
    ];

    protected array $fillable = ['title', 'body', 'author_id'];

    use SoftDeletes;
}
```

### Requêtes

[](#requêtes)

```
// Eager loading anti N+1
$posts = Post::with('author', 'comments')
    ->withCount('comments')
    ->published()          // scope
    ->latest()
    ->paginate(15);

// Scope personnalisé
public function scopePublished(QueryBuilder $query): QueryBuilder
{
    return $query->where('status', PostStatus::Published)
                 ->where('published_at', 'events->dispatch(new PostPublished($post));

// Dans NewsletterModule : écoute — sans importer BlogModule
#[EventListener]
class SendNewsletterOnPublish
{
    public function handle(PostPublished $event): void
    {
        $this->mailer->queue(new NewPostEmail($event->post));
    }
}
```

L'abonnement est auto-détecté via `#[EventListener]` à condition que le module soit dans le graphe de dépendances.

---

Templates Twig
--------------

[](#templates-twig)

Namespaces par module :

```
{# modules/Blog/templates/posts/index.html.twig #}
{% extends '@app/layouts/main.html.twig' %}

{% block content %}
    {% for post in posts %}
        {{ post.title }}
        {{ post.published_at | time_ago }}
    {% endfor %}
    {{ paginator(posts) }}
{% endblock %}
```

### Fonctions et filtres disponibles

[](#fonctions-et-filtres-disponibles)

CatégorieExemplesRouting`route('name', params)`, `current_route()`Assets`asset('app.css')` — cache-busting automatiqueFormulaires`csrf_field()`, `old('field')`, `errors('field')`Filtres`time_ago`, `markdown`, `slug`, `money`, `truncate`Auth`auth_user()`, `is_auth()`---

CLI Forge
---------

[](#cli-forge)

```
php forge list                           # toutes les commandes disponibles
php forge make:module              # scaffolde un module complet
php forge make:controller  [opts]  # --module, --resource, --api
php forge make:model  [opts]       # --module, --migration, --factory
php forge make:middleware
php forge make:command
php forge migrate [--fresh] [--seed] [--rollback]
php forge db:seed [--class=]
php forge route:list
php forge module:graph [--check]
php forge down [--message=] [--retry=]  # mode maintenance
php forge up
php forge serve [--host=] [--port=]
```

### Commandes personnalisées

[](#commandes-personnalisées)

```
#[Command(signature: 'blog:seed {count=10} {--fresh}', description: 'Seed blog posts')]
class SeedBlogCommand extends BaseCommand
{
    public function handle(): int
    {
        $count = (int) $this->argument('count');
        // ...
        $this->info("$count posts créés.");
        return self::SUCCESS;
    }
}
```

---

Ce qui est sur étagère vs fait maison
-------------------------------------

[](#ce-qui-est-sur-étagère-vs-fait-maison)

Délégué àConstruit par IronFlow`symfony/http-foundation` — HTTP bas niveauConteneur DI avec attributs PHP 8`symfony/console` — fondation CLISystème de modules + graphe de dépendances`twig/twig` — moteur de templatesRouteur fluide avec route naming`doctrine/dbal` — couche SQLORM Active Record, migrations, factories`monolog/monolog` — loggingMiddlewares, bus d'événements`firebase/php-jwt` — tokens JWTExtension Twig, scaffolding CLI complet`vlucas/phpdotenv` — variables d'envAuth session + JWT, validation, CSRFChaque composant externe est **wrappé derrière nos propres interfaces** dans `Ironflow\Ironflow\`. Ton code n'importe jamais `Symfony\Component\HttpFoundation\Request` — seulement `Ironflow\Ironflow\Http\Request`.

---

Roadmap
-------

[](#roadmap)

- Conteneur DI avec attributs, résolution par réflexion
- Architecture modulaire HMVC avec graphe de dépendances
- Routeur fluide — groupes, ressources, named routes, contraintes
- ORM Active Record — relations, eager loading, scopes, soft deletes
- Migrations et Schema builder
- CLI forge avec scaffolding complet
- Auth session + JWT
- Validation
- CSRF, middlewares globaux et par-route
- Bus d'événements découplé
- Extension Twig maison + view composers
- Cache — facade unifiée, drivers file/redis
- File d'attente de jobs (queue)
- WebSockets / diffusion temps réel
- Documentation complète avec recettes

---

Contribuer
----------

[](#contribuer)

```
git clone https://github.com/ironflow-framework/framework
git clone https://github.com/ironflow-framework/skeleton

cd skeleton
composer install   # le framework est lié en repository path (symlink local)
php forge serve
```

```
# Lancer les tests
vendor/bin/phpunit

# Avec couverture
vendor/bin/phpunit --coverage-html coverage/
```

**Conventions :**

- PSR-12, typages stricts (`declare(strict_types=1)` dans tous les fichiers)
- Chaque feature → test unitaire + test d'intégration
- Pas de breaking change en patch, dépréciation avant suppression en minor
- Issues marquées [`good first issue`](https://github.com/ironflow-framework/framework/issues?q=label%3A%22good+first+issue%22) pour débuter

1. Fork du dépôt concerné
2. `git checkout -b feature/ma-feature`
3. Tests au vert (`vendor/bin/phpunit`)
4. Pull Request vers `main` avec description des changements

---

*Chaque framework est une théorie du bon code.*
*IronFlow parie sur la modularité explicite, les attributs PHP 8, et le respect de tes conventions à toi.*

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance92

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

9

Last Release

40d ago

Major Versions

v0.1.5 → v1.0.02026-06-10

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/147180124?v=4)[Aure Dulvresse](/maintainers/AureDulvresse)[@AureDulvresse](https://github.com/AureDulvresse)

---

Top Contributors

[![AureDulvresse](https://avatars.githubusercontent.com/u/147180124?v=4)](https://github.com/AureDulvresse "AureDulvresse (31 commits)")

###  Code Quality

TestsPest

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/ironflow-framework-framework/health.svg)

```
[![Health](https://phpackages.com/badges/ironflow-framework-framework/health.svg)](https://phpackages.com/packages/ironflow-framework-framework)
```

###  Alternatives

[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

585.6M602](/packages/shopware-core)[open-dxp/opendxp

Content &amp; Product Management Framework (CMS/PIM)

9421.6k64](/packages/open-dxp-opendxp)[tempest/framework

The PHP framework that gets out of your way.

2.2k34.4k16](/packages/tempest-framework)[laravel/framework

The Laravel Framework.

34.8k543.8M20.5k](/packages/laravel-framework)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.8k3.8M511](/packages/pimcore-pimcore)[shopware/platform

The Shopware e-commerce core

3.4k1.5M3](/packages/shopware-platform)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
