nils-framework/nils-orm
Composer 安装命令:
composer require nils-framework/nils-orm
包简介
ORM ActiveRecord léger avec champs typés, validation par règles, relations, Eager Loading, Identity Map et Serializer pour le framework NILS
README 文档
README
Le composant nils-orm est la couche de mapping objet-relationnel (ORM) légère du framework PHP NILS. Construit au-dessus de nils-database, il fournit un pattern ActiveRecord sans attributs ni annotations : les modèles déclarent leur structure via une méthode definition() explicite, en parfaite cohérence avec la philosophie du framework.
Il embarque un système de champs typés, un moteur de validation par règles, des relations (One-to-Many, Many-to-One, Many-to-Many), l'Eager Loading anti N+1, une Identity Map, la pagination automatique et la génération de schéma SQL.
🚀 Fonctionnalités Clés
- Modèles ActiveRecord déclaratifs : Structure définie par code (
definition()), sans attributs PHP 8 ni configuration externe. - 13 types de champs typés :
StringField,IntField,FloatField,BooleanField,DateField,DateTimeField,EmailField,PasswordField,TextField,JsonField,UuidField,ForeignKeyField... avec cast automatique PHP ↔ SQL. - Validation par règles (Fluent) :
Unique,Exists,In,Min,Max,Regex— extensibles viaRuleInterface. - Relations complètes :
BelongsTo(Many-to-One),HasMany(One-to-Many) etBelongsToMany(Many-to-Many via table pivot), avec chargement paresseux (Lazy Loading) par accès magique. - Eager Loading (
with()) : Résolution groupée des relations en une seule requêteWHERE INpour éliminer le problème des requêtes N+1. - Identity Map : Cache d'instances en mémoire garantissant qu'une ligne SQL correspond toujours au même objet PHP durant la requête.
- Repository Pattern : Couche d'accès haut niveau — CRUD rapide, recherche textuelle, insertion de masse (Bulk Insert), transactions et pagination.
- Serializer (inspiré de Django REST Framework) : Validation des données entrantes et extraction structurée des données sortantes pour vos APIs.
- Schema Engine : Génération automatique des tables, index et contraintes de clés étrangères à partir des définitions de modèles.
- Hooks de cycle de vie :
beforeSave(),afterSave(),beforeDelete()pour greffer votre logique métier. - Timestamps automatiques : Gestion native de
created_at/updated_at.
📦 Installation
Installez le module via Composer :
composer require nils-framework/nils-orm
Note : Ce package requiert
nils-framework/nils-database(drivers, QueryBuilder, transactions) et s'intègre nativement au middleware d'exceptions denils-coreviaValidationException.
🛠️ Utilisation de Base
1. Définir un Modèle
use NilsOrm\Model;
use NilsOrm\Fields\StringField;
use NilsOrm\Fields\EmailField;
use NilsOrm\Fields\PasswordField;
use NilsOrm\Fields\BooleanField;
use NilsOrm\Rules\Unique;
use NilsOrm\Rules\Min;
class User extends Model
{
protected static string $table = 'users';
public static function definition(): array
{
return [
'nom' => new StringField(),
'email' => (new EmailField())->addRule(new Unique()),
'password' => (new PasswordField())->addRule(new Min(8)),
'actif' => new BooleanField(),
];
}
}
2. Opérations CRUD
// Création
$user = new User(['nom' => 'Traore', 'email' => 'traore@nils.dev']);
$user->save(); // Validation automatique avant insertion
// Lecture (avec Identity Map)
$user = User::find(1);
// Mise à jour
$user->nom = 'Traore N.';
$user->save();
// Suppression
$user->delete();
3. Déclarer des Relations
use NilsOrm\Relations\HasMany;
use NilsOrm\Relations\BelongsTo;
use NilsOrm\Relations\BelongsToMany;
class Article extends Model
{
public static function relations(): array
{
return [
'auteur' => new BelongsTo(User::class, 'user_id'),
'categories' => new BelongsToMany(Category::class, 'article_category', 'article_id', 'category_id'),
];
}
}
// Accès paresseux (Lazy Loading)
$article = Article::find(1);
echo $article->auteur->nom; // Charge le parent à la demande
$categories = $article->categories; // Charge via la table pivot
4. Repository, Recherche et Pagination
use NilsOrm\Repository;
$repo = new Repository(Article::class);
// Eager Loading : 2 requêtes au total, quel que soit le nombre d'articles
$pagination = $repo->with(['auteur', 'categories'])->paginate(page: 1, perPage: 15);
// Recherche textuelle filtrée
$qb = $repo->search('framework', ['titre', 'contenu'], ['actif' => 1]);
$resultats = $repo->paginate($qb, page: 2);
// Réponse API standardisée
return $pagination->toArray();
// ['items' => [...], 'meta' => ['total' => ..., 'current_page' => ..., 'per_page' => ..., 'last_page' => ...]]
5. Transactions et Insertion de Masse
$repo->transaction(function () use ($repo) {
$repo->create(['titre' => 'Article 1']);
$repo->createMany([
['titre' => 'Article 2', 'user_id' => 1],
['titre' => 'Article 3', 'user_id' => 1],
]);
}); // Rollback automatique en cas d'exception
6. Valider les Données Entrantes (Serializer)
use NilsOrm\Serializer;
class UserSerializer extends Serializer
{
public function fields(): array
{
return (User::definition()); // Réutilisation directe des champs du modèle
}
}
// Dans un contrôleur NILS
$serializer = new UserSerializer(data: $body);
$donnees = $serializer->validateOrFail(); // Lève ValidationException → réponse 400 JSON structurée
7. Générer le Schéma SQL
use NilsOrm\SchemaEngine;
SchemaEngine::createTableFromModel(User::class);
SchemaEngine::createTableFromModel(Article::class);
// Tables, index, contraintes UNIQUE et clés étrangères créés automatiquement
📦 Architecture du Dépôt
src/
├── Exceptions/
│ └── ValidationException.php # Exception 400 structurée par champ
└── NilsOrm/
├── Fields/ # 13 types de champs typés (cast + SQL)
├── Relations/ # BelongsTo, HasMany, BelongsToMany
├── Rules/ # Unique, Exists, In, Min, Max, Regex
├── Model.php # ActiveRecord (CRUD, hooks, lazy loading)
├── Repository.php # Accès haut niveau (Eager Loading, transactions)
├── IdentityMap.php # Cache d'instances en mémoire
├── Pagination.php # Résultats paginés prêts pour JSON
├── SchemaEngine.php # Génération DDL depuis les modèles
└── Serializer.php # Validation entrante / extraction sortante
⚙️ Cache et Cohérence
L'Identity Map garantit que deux appels à User::find(1) au sein d'une même requête HTTP retournent la même instance PHP, sans requête SQL redondante. Le registre est automatiquement synchronisé lors des opérations save() et peut être vidé manuellement :
use NilsOrm\IdentityMap;
IdentityMap::clear(); // Réinitialisation complète du registre
📄 Licence
Ce projet est distribué sous licence MIT. Développé avec passion par Traore.
nils-framework/nils-orm 适用场景与选型建议
nils-framework/nils-orm 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 06 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「framework」 「orm」 「validation」 「serializer」 「relations」 「active-record」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 nils-framework/nils-orm 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 nils-framework/nils-orm 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 nils-framework/nils-orm 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
PHP Framework HLEB2 is the foundation of the web application. Provides ease of development and application performance.
Kinikit - PHP Application development framework MVC component
PHP Database ORM for Symfony1. Do NOT use for new projects: please move to a newest Symfony release and Doctrine2
Adds request-parameter validation to the SLIM 3.x PHP framework
PeskyORM - annoying ORM that contains tons of exceptions and throws them when anything goes wrong
A jQuery augmented PHP library for creating and validating HTML forms
统计信息
- 总下载量: 1
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 43
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-06-10