Crudify sert a generer rapidement un CRUD Laravel a partir d'une commande ou d'un fichier YAML.
Ce guide est volontairement simple :
- un seul chemin recommande
- un seul exemple complet
- les preconditions expliquees avant de lancer generation
- la reference technique regroupee a la fin
Si vous cherchez le fonctionnement interne du package ou les details pour contribuer, utilisez plutot README.md.
Crudify peut generer :
- un modele Eloquent
- une migration
- une factory
- un seeder
- une policy
- des pages CRUD pretes a l'emploi
Fonctionnalites utiles :
- relations
belongsTo,hasMany,hasOne,belongsToMany - uploads simples et multiples
- soft deletes
- champs de recherche
- synchronisation many-to-many
- PHP
^8.2 - Laravel
^11.0 | ^12.0 | ^13.0
Ordre conseille :
- installer le package
- preparer le front avec
php artisan crudify:installouphp artisan crudify:setup - creer un fichier YAML a la racine du projet
- remplir ce fichier avec votre modele, vos champs et vos relations
- lancer
php artisan crudify:generate - lancer
php artisan migrate
composer require devalade/crudify --devOption la plus simple :
php artisan crudify:installCette commande peut :
- installer
livewire/flux - installer dependances front si
package.jsonexiste - lancer
php artisan crudify:setup
Si vous avez deja les dependances et que vous voulez seulement preparer les fichiers front :
php artisan crudify:setupCette commande prepare notamment :
resources/css/app.cssresources/js/app.js- les layouts avec
@fluxAppearance,@vite(...)et@fluxScripts
Dans l'exemple complet plus bas, on reference User, Category, Tag et Comment.
Il faut donc etre explicite :
Userdoit deja exister si vous gardez relationuserCategorydoit deja exister si vous gardez relationcategoryCommentdoit deja exister si vous gardez relationcommentsTagpeut etre cree automatiquement par Crudify dans casbelongsToManysi modeleTagn'existe pas encore
Il faut aussi penser aux tables et aux migrations :
usersdoit deja exister si vous gardez relationusercategoriesdoit deja exister si vous gardez relationcategorycommentsdoit deja exister si vous voulez exploiter la relationcommentstagsest plus souple dans cas many-to-many
Point tres important :
- une relation
belongsTopeut creer automatiquement le champ*_idsi ce champ n'est pas declare dansfields - si le champ existe deja dans
fields, Crudify garde cette definition et ne le cree pas une deuxieme fois - declarez explicitement
user_idoucategory_iddansfieldsquand vous voulez controler la table cible,nullable,index,default, etc. - si vous utilisez un nom de relation different du modele, par exemple
authorversUser, Crudify creeauthor_idet reference la tableusers
Donc, si certains modeles ou certaines tables n'existent pas encore, vous avez deux choix :
- les creer d'abord dans votre projet
- simplifier l'exemple et retirer les relations concernees
Creez fichier YAML a la racine du projet Laravel.
Exemples selon votre systeme :
# macOS / Linux
touch post.yaml# Windows PowerShell
New-Item -Path .\post.yaml -ItemType File:: Windows CMD
type nul > post.yamlDans ce guide :
- le fichier s'appelle
post.yaml - il est place a la racine du projet
- il sert a generer modele
Post
Copiez ce contenu dans post.yaml :
model: Post
fields:
title:
type: string
unique: true
slug:
type: string
unique: true
index: true
excerpt:
type: text
body:
type: text
featured_image:
type: image
nullable: true
gallery:
type: image
multiple: true
nullable: true
is_published:
type: boolean
default: false
published_at:
type: datetime
nullable: true
relationships:
user:
type: belongsTo
model: User
display: email
label: Auteur
category:
type: belongsTo
model: Category
display: name
label: Categorie
tags:
type: belongsToMany
model: Tag
display: slug
label: Tags
comments:
type: hasMany
model: Comment
options:
soft_deletes: true
volt: trueDans cet exemple :
title,slug,excerpt,bodysont champs texte du postfeatured_imagegere image principalegallerygere plusieurs imagesis_publishedetpublished_atgerent publicationsoft_deletes: trueactive corbeille Laravel
Dans cet exemple :
userdeclare la methode Eloquentuser()et cree automatiquementuser_idcategorydeclare la methode Eloquentcategory()et cree automatiquementcategory_idtagscree une relation many-to-many, l'interface de selection, et la migration pivotcommentsdeclare la relationhasMany; la cle etrangere est portee par la tablecomments, pas parposts
Le plus simple est donc de ne pas repeter user_id ou category_id dans fields si la relation belongsTo suffit.
Exemple minimal :
fields:
title:
type: string
relationships:
author:
type: belongsTo
model: User
display: emailCet exemple cree author_id dans la migration de posts et reference la table users.
Si vous voulez controler la colonne vous-meme, declarez-la dans fields :
fields:
user_id:
type: foreign
foreign: users
nullable: true
relationships:
user:
type: belongsTo
model: User
display: emailCrudify utilisera ce user_id existant et ne le creera pas une deuxieme fois.
Si vous voulez utiliser un autre nom de colonne pour une relation :
relationships:
author:
type: belongsTo
model: User
display: email
foreign_key: user_iduser :
- le post appartient a un utilisateur
display: emailaffiche email dans interfacelabel: Auteuraffiche libelle "Auteur"- ce bloc suppose que modele
Useret tableusersexistent deja
category :
- le post appartient a une categorie
display: nameaffiche nom de categorie- ce bloc suppose que modele
Categoryet tablecategoriesexistent deja
tags :
- le post peut avoir plusieurs tags
display: slugaffiche slug du taglabel: Tagsaffiche libelle "Tags"- dans create/edit, utilisateur selectionne plusieurs tags
- dans index/show, tags apparaissent en badges
- si modele
Tagmanque, Crudify peut le generer dans ce cas
comments :
- le post possede plusieurs commentaires
- cette relation est ajoutee au modele
- ce bloc suppose que modele
Commentet tablecommentsexistent deja
Une fois post.yaml pret :
php artisan crudify:generate --file=post.yaml
php artisan migrateCrudify genere par defaut notamment :
app/Models/Post.phpdatabase/migrations/*_create_posts_table.phpdatabase/factories/PostFactory.phpdatabase/seeders/PostSeeder.phpapp/Policies/PostPolicy.phpresources/views/pages/posts/index.blade.phpresources/views/pages/posts/create.blade.phpresources/views/pages/posts/edit.blade.phpresources/views/pages/posts/show.blade.php
Dans cas many-to-many avec tags, Crudify peut aussi generer :
app/Models/Tag.phpsi absent- migration pivot
post_tag
Crudify enregistre automatiquement routes detectees depuis resources/views/pages/....
En pratique :
- vous n'avez pas besoin d'ecrire routes au debut
- c'est utile pour aller vite
Quand vous voulez reprendre controle manuel :
php artisan crudify:eject-routesEffet :
- Crudify copie routes dans
routes/web.php - auto-decouverte est desactivee pour ces routes
- vous pouvez ensuite proteger ou reorganiser ces routes vous-meme
Exemple de bloc ejecte :
// CRUDify Ejected Routes
Route::livewire('/posts', 'pages::posts.index')->name('posts.index');
Route::livewire('/posts/create', 'pages::posts.create')->name('posts.create');
Route::livewire('/posts/{post}/edit', 'pages::posts.edit')->name('posts.edit');
Route::livewire('/posts/{post}/show', 'pages::posts.show')->name('posts.show');
// End CRUDify Ejected RoutesExemple avec auth :
use Illuminate\Support\Facades\Route;
Route::middleware(['auth'])->group(function () {
// CRUDify Ejected Routes
Route::livewire('/posts', 'pages::posts.index')->name('posts.index');
Route::livewire('/posts/create', 'pages::posts.create')->name('posts.create');
Route::livewire('/posts/{post}/edit', 'pages::posts.edit')->name('posts.edit');
Route::livewire('/posts/{post}/show', 'pages::posts.show')->name('posts.show');
// End CRUDify Ejected Routes
});Exemple avec auth et verified :
use Illuminate\Support\Facades\Route;
Route::middleware(['auth', 'verified'])->group(function () {
// CRUDify Ejected Routes
Route::livewire('/posts', 'pages::posts.index')->name('posts.index');
Route::livewire('/posts/create', 'pages::posts.create')->name('posts.create');
Route::livewire('/posts/{post}/edit', 'pages::posts.edit')->name('posts.edit');
Route::livewire('/posts/{post}/show', 'pages::posts.show')->name('posts.show');
// End CRUDify Ejected Routes
});Exemple avec prefixe admin :
use Illuminate\Support\Facades\Route;
Route::prefix('admin')
->middleware(['auth', 'verified'])
->group(function () {
Route::livewire('/posts', 'pages::posts.index')->name('posts.index');
Route::livewire('/posts/create', 'pages::posts.create')->name('posts.create');
Route::livewire('/posts/{post}/edit', 'pages::posts.edit')->name('posts.edit');
Route::livewire('/posts/{post}/show', 'pages::posts.show')->name('posts.show');
});nom:type:modificateur1:modificateur2
Exemples :
title:stringbody:textemail:string:uniquepublished_at:datetime:nullablephoto:imagedocuments:file:multipleuser_id:foreign:userssi vous voulez declarer explicitement une cle etrangere dans les champs
string, text, integer, bigint, float, double, decimal, boolean, date, datetime, timestamp, time, json, uuid, email, foreign, image, file
nullableuniqueindexdefault:valueforeign:tablemultiple
nom:type:modele[:display[:foreign_key]]
Exemples :
user:belongsTo:User:emailcategory:belongsTo:Category:nameauthor:belongsTo:User:email:user_idtags:belongsToMany:Tag:slugcomments:hasMany:Comment
belongsTohasManyhasOnebelongsToMany
display: champ affiche dans select, checkbox, badges et pages detaillabel: libelle visible dans interfaceforeign_key: nom de colonne a utiliser pour une relationbelongsTosi le nom par defautrelation_idne convient pas
php artisan crudify:install
php artisan crudify:setup
php artisan crudify:generate --file=post.yaml
php artisan crudify:eject-routes
php artisan migratephp artisan crudify:generate {model}
--fields=
--file=
--relationships=
--only=
--skip=
--soft-delete
--searchable=
--force
--dry-runphp artisan crudify:stubsPuis modifiez :
stubs/crudify/
composer test
composer test:unit
composer test:feature
composer analyse
composer format
composer format:checkMIT