PHPackages                             bboezio/neophp - 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. bboezio/neophp

ActiveProject[Framework](/categories/framework)

bboezio/neophp
==============

NeoPHP - PHP8 Framework

v2.7.0(1w ago)121↓75%MITPHPPHP &gt;=8.1CI passing

Since Apr 22Pushed yesterdayCompare

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

READMEChangelog (10)Dependencies (25)Versions (59)Used By (0)

NeoPHP
======

[](#neophp)

Framework PHP 8.1+ centré sur :

- un noyau applicatif dans `neo/`
- une CLI interne dans `bin/neo`
- des projets applicatifs isolés dans `src//`

Ce dépôt contient le moteur du framework et un projet d'exemple dans `src/Test/`.

NeoPHP vise un autre point d'équilibre que Symfony ou Laravel. L'objectif n'est pas d'empiler des couches, des bundles ou un ecosysteme très large, mais de fournir un noyau PHP lisible, compact et directement exploitable pour construire une application complete sans sortir du depot. Le framework mise sur une structure simple, une CLI integrée, des modules coeur autodétéctes et un workflow multi-projets qui reste explicite.

En pratique, NeoPHP s'adresse surtout aux projets qui veulent aller vite sans adopter toute la complexite organisationnelle des gros frameworks généralistes. Par rapport a Symfony, il réduit fortement la cérémonie de configuration et la fragmentation entre composants. Par rapport a Laravel, il se montre plus minimal, plus direct dans son architecture, et moins dépendant d'une couche "magique" ou d'un ensemble d'outils externes. Si le besoin est un framework plus petit, plus prévisible et plus facile a suivre de bout en bout dans le code source, c'est précisement le terrain de NeoPHP.

Sommaire
--------

[](#sommaire)

- [Vue d'ensemble](#vue-densemble)
- [Architecture du depot](#architecture-du-d%C3%A9p%C3%B4t)
- [Cartographie du coeur](#cartographie-du-coeur)
- [Cycle d'execution](#cycle-d%C3%A9x%C3%A9cution)
- [Structure d'un projet](#structure-dun-projet)
- [Conteneur DI et configuration](#conteneur-di-et-configuration)
- [Couche HTTP](#couche-http)
- [Routing et controleurs](#routing-et-contr%C3%B4leurs)
- [Vues Twig, assets et traductions](#vues-twig-assets-et-traductions)
- [Base de donnees et QueryBuilder](#base-de-donnees-et-querybuilder)
- [ORM et repositories](#orm-et-repositories)
- [Formulaires, upload et validation](#formulaires-upload-et-validation)
- [Securite: auth, mot de passe, middlewares, csrf](#securite-auth-mot-de-passe-middlewares-csrf)
- [Events](#events)
- [Crons](#crons)
- [Cache, logs, mailer, profiler et erreurs](#cache-logs-mailer-profiler-et-erreurs)
- [CLI et generateurs](#cli-et-generateurs)
- [Tests PHPUnit](#tests-phpunit)
- [Deploiement](#deploiement)
- [Dependances et prerequis](#d%C3%A9pendances-et-pr%C3%A9requis)

Vue d'ensemble
--------------

[](#vue-densemble)

NeoPHP repose sur deux points d'entrée :

- `public/index.php` pour le runtime HTTP
- `bin/neo` pour la CLI

Le coeur passe par `Neo\App`, qui :

- détecte le projet courant
- initialise le conteneur
- enregistre les chemins applicatifs du projet courant
- découvre automatiquement les modules `*Module.php` dans `neo/Core/`
- ordonne ces modules selon leurs dépendances puis éxécute `register()` / `boot()`
- active Twig, la BDD, les assets, la traduction, l'auth, le cache, les crons, le mailer et le profiler
- scanne les contrôleurs, routes, listeners et crons applicatifs
- éxécute la requête HTTP ou la commande CLI
- centralise la gestion des erreurs

Architecture du dépôt
---------------------

[](#architecture-du-dépôt)

```
.
|-- bin/
|   `-- neo
|-- neo/
|   |-- App.php
|   `-- Core/
|       |-- Asset/
|       |-- Console/
|       |-- Controller/
|       |-- Cron/
|       |-- Database/
|       |-- DI/
|       |-- Error/
|       |-- Event/
|       |-- Extension/
|       |-- Http/
|       |-- Module/
|       |-- Profiler/
|       |-- Routing/
|       |-- Security/
|       |-- Testing/
|       |-- Translation/
|       |-- Utils/
|       |-- Validator/
|       `-- View/
|-- public/
|   |-- index.php
|   `-- builds/
|-- src/
|   `-- /
|       |-- App/
|       |-- Assets/
|       |-- Config/
|       |-- Database/
|       |-- Model/
|       |-- Repository/
|       |-- Storage/
|       |-- Tests/
|       `-- Translations/
|-- composer.json
`-- vendor/

```

Le projet d'éxemple présent dans le dépôt est `src/Test/`.

Cartographie du coeur
---------------------

[](#cartographie-du-coeur)

Le noyau `neo/Core/` est structuré par sous-système :

- `Asset/`gestion des assets, compilation CSS / JS / Less, manifest, helper Twig `asset()`
- `Console/`chargement automatique des commandes CLI et générateurs
- `Controller/``AbstractController` et les raccourcis HTTP / auth / events / upload
- `Cron/`attribut `#[Cron]`, scan de `App/Crons`, listing et éxécution planifiée avec timezone et lock optionnel
- `Database/`connexion PDO, `DatabaseManager`, introspection, `QueryBuilder`, formulaires, pagination, ORM, repositories, génération depuis le schéma et migrations
- `DI/`conteneur de dépendances et autowiring
- `Error/``ErrorHandler` et `FrameworkException`
- `Event/`event dispatcher, attributs listeners, subscribers et evenements coeur
- `Extension/`extensions utilitaires `Array`, `Date`, `File`, `Html`, `Json`, `Number`, `Path`, `String`, `Url` exposées en PHP et dans Twig
- `Http/``Request`, responses, fichiers uploades, session, cookie, flash
- `Module/`système de modules, découverte des `*Module.php`, résolution des dépendances et cycle `register()` / `boot()`
- `Profiler/`barre de debug en environnement `dev`, collecteurs request / router / SQL / events / logs / auth / traduction / mail
- `Routing/`route collection, scan des contrôleurs, génération d'URL, attributs `Route`, `MainRoute`, `RateLimit`, `Maintenance`
- `Security/`auth session / token, JWT, middlewares, mot de passe, CSRF
- `Testing/`base de tests, scaffold PHPUnit, generation auto via `#[Test]`
- `Translation/`résolution de locale, chargement / écriture des traductions, extension Twig
- `Utils/`config, cache, logs, mailer et commandes utilitaires
- `Validator/`contraintes et moteur de validation
- `View/`intégration Twig et enregistrement des fonctions / filtres

Sous-dossiers notables dans `neo/Core/` :

```
Asset/      -> Commands/, Compiler/, Exception/
Console/    -> Attribute/, Commands/, Helper/, Interface/
Controller/ -> Commands/, Exception/, Interface/
Cron/       -> Attribute/, Commands/, Exception/
Database/   -> Builder/, Commands/, Exception/, Form/, Migration/, ORM/
DI/         -> Exception/
Error/      -> Exception/
Event/      -> Attribute/, Commands/, Contract/, Event/, Exception/
Extension/  -> Array/, Date/, File/, Html/, Json/, Number/, Path/, String/, Url/
Http/       -> Client/, File/, Response/
Module/     -> Exception/, Interface/
Profiler/   -> Collector/, Toolbar/
Routing/    -> Attribute/, Commands/, Exception/
Security/   -> Auth/, Csrf/, Middleware/
Testing/    -> Attribute/, Commands/, Context/, Enum/, Exception/, Generator/, Scaffold/, Scanner/, Template/
Translation/-> Exception/, Helper/, Interface/
Utils/      -> Cache/, Config/, Logger/, Mailer/
Validator/  -> Assert/
View/       -> Exception/, Interface/

```

Cycle d'éxécution
-----------------

[](#cycle-déxécution)

### En HTTP

[](#en-http)

`Neo\App` cherche un projet en lisant `src/*/Config/app.config.php` et compare la clé `access` a `HTTP_HOST` / `SERVER_NAME`.

Si un seul projet existe dans `src/`, il est sélectionné automatiquement.

### En CLI

[](#en-cli)

Les commandes qui opèrent sur un projet existant attendent en général `--project=NomDuProjet`.

Exceptions notables :

- `app:make:project`
- `app:sync:projects`
- `app:serve`

Exemple :

```
php bin/neo cache:clear --project=Test
```

Structure d'un projet
---------------------

[](#structure-dun-projet)

Un projet generé par `app:make:project` contient d'abord :

```
src/Blog/
|-- .gitignore
|-- composer.json
|-- App/
|   |-- Controllers/
|   |-- Forms/
|   |-- Middlewares/
|   |-- Services/
|   `-- Views/
|-- Assets/
|-- Config/
|   |-- api.config.php
|   |-- app.config.php
|   |-- cache.config.php
|   |-- database.config.php
|   |-- deploy.config.php
|   |-- logger.config.php
|   |-- mailer.config.php
|   |-- session.config.php
|   `-- twig.config.php
|-- Model/
|-- Repository/
|-- Storage/
`-- Translations/

```

Sans l'option `--skeleton`, le générateur ajoute aussi :

```
src/Blog/
|-- Assets/
|   |-- css/
|   `-- js/
|-- App/Views/
|   |-- errors/
|   |-- layouts/
|   |-- pages/default/
|   `-- partials/
`-- Translations/
    |-- en/
    `-- fr/

```

Certains dossiers sont créés plus tard, quand la fonctionnalité est activée :

- `App/Crons/` via `make:cron`
- `App/Event/Listener/` via `make:event` et `make:event:listener`
- `Database/Migrations/` via `database:migration:generate`
- `Tests/` via `make:test` ou `make:test:auto`

Les configs sensibles `database.config.php`, `deploy.config.php`, `api.config.php` et `mailer.config.php` sont prévues pour être ignorées par Git dans le `.gitignore` généré. Le générateur ignore aussi `Storage/`.

Conteneur DI et configuration
-----------------------------

[](#conteneur-di-et-configuration)

Le conteneur `Neo\Core\DI\Container` fournit :

- `set()` pour enregistrer un service ou une factory
- `get()` pour résoudre un service
- `bind()` pour mapper une abstraction vers une implémentation
- `make()` pour instancier une classe avec des paramêtres runtime
- autowiring via reflexion
- support des constructeurs de contrôleurs et de services

Exemple :

```
