Laravel 12 testproject met een herbruikbare Blueprint setup voor API-projecten.
composer require --dev laravel-shift/blueprint
php artisan vendor:publish --tag=blueprint-config
php artisan vendor:publish --tag=blueprint-stubscomposer install
cp .env.example .env
php artisan key:generate
php artisan migratecomposer bp:snapshot -- drafts/<feature>.yaml
composer bp:delta -- drafts/<feature>.yaml
composer bp:smart -- drafts/<feature>.yaml
composer bp:smart:full -- drafts/<feature>.yaml
composer bp:routes -- drafts/<feature>.yaml
composer bp:test -- drafts/<feature>.yamlbp:snapshot: maakt of ververst de snapshot voor een draft (storage/app/blueprint-delta).bp:delta: vergelijkt draft met snapshot en maakt alleen add-column migraties waar nodig.bp:smart: veilige standaardflow.- draait eerst delta-check
- genereert daarna model/factory/request/resource
- slaat routes over om dubbele route-regels te voorkomen
bp:smart:full: alsbp:smart, maar inclusief controller + tests.bp:routes: voegt alleen ontbrekendeRoute::apiResource(...)regels toe inroutes/api.php.bp:test: genereert alleen tests vanuit de draft.
- Start per nieuwe draft met snapshot:
composer bp:snapshot -- drafts/<feature>.yaml- Dagelijks werken met:
composer bp:smart -- drafts/<feature>.yaml- Alleen als je controllers/tests bewust wilt regenereren (eerste run):
composer bp:smart:full -- drafts/<feature>.yaml- Routes synchroniseren:
composer bp:routes -- drafts/<feature>.yamlGebruik kleine, losse drafts per feature/model zodat builds voorspelbaar blijven.
Voorbeeld:
drafts/
post.yaml
member.yaml
team.yaml
skill.yaml
time_entry.yaml
Voor demo's kun je een submap gebruiken:
drafts/
examples/
Project.yaml
Member.yaml
Team.yaml
Skill.yaml
TimeEntry.yaml
Pricing.yaml
Praktische regels:
- Houd 1 hoofdonderwerp per draft aan.
- Zet alleen modellen in de draft die je in die run wilt genereren/updaten.
- Gebruik
bp:snapshotvoordat je delta-gedrag verwacht op die draft.
Als je een belongsToMany met eigen pivot model wilt (handig voor extra velden, casts, linter/phpstan generics), gebruik dan :&PivotModel.
Voorbeeld (zoals in drafts/examples/Member.yaml):
models:
Member:
team_id: id foreign:teams
name: string
relationships:
belongsTo: Team
belongsToMany: Skill:&MemberSkill
MemberSkill:
member_id: id foreign:members
skill_id: id foreign:skills
level: enum:junior,medior,senior,lead
hourly_price: decimal:10,2
certified_at: datetime nullable
relationships:
belongsTo: Member, Skillmodels:
Skill:
name: string unique
category: enum:backend,frontend,devops,design,qa
default_rate: decimal:10,2 nullable
active_from: datetime nullable
relationships:
belongsToMany: Member:&MemberSkill
controllers:
Skill:
resource: api
Wat dit doet:
MemberkrijgtbelongsToManynaarSkillmet pivot modelMemberSkill.MemberSkillwordt als eigen model gegenereerd voor de pivot tabel.- Je kunt in het pivot model eigen velden zoals
decimal,datetimezetten.
composer require --dev laravel-shift/blueprint
php artisan vendor:publish --tag=blueprint-config
php artisan vendor:publish --tag=blueprint-stubsKopieer deze onderdelen uit TestGenerateTester naar je doelproject:
cp /pad/naar/TestGenerateTester/config/blueprint.php config/blueprint.php
mkdir -p stubs/blueprint
cp -R /pad/naar/TestGenerateTester/stubs/blueprint/. stubs/blueprint/
mkdir -p app/Blueprint/Generators
cp -R /pad/naar/TestGenerateTester/app/Blueprint/Generators/. app/Blueprint/Generators/
cp /pad/naar/TestGenerateTester/app/Support/BlueprintWorkflow.php app/Support/BlueprintWorkflow.php
cp /pad/naar/TestGenerateTester/routes/console.php routes/console.phpVoeg dit toe aan composer.json onder scripts:
"bp:delta": [
"@php artisan bp:delta"
],
"bp:snapshot": [
"@php artisan bp:snapshot"
],
"bp:routes": [
"@php artisan bp:routes:sync"
],
"bp:smart": [
"@php artisan bp:smart"
],
"bp:smart:full": [
"@php artisan bp:smart --full"
],
"bp:test": [
"@php artisan blueprint:build --skip=routes --only=tests"
],Voor demo/presentatie staan voorbeelden in:
drafts/examples/Member.yamldrafts/examples/Team.yamldrafts/examples/Skill.yamldrafts/examples/TimeEntry.yaml
- Gebruik
bp:smartals default command. - Gebruik
bp:smart:fullals 1ste keer ipvbp:smart. - Gebruik
bp:snapshotminimaal 1 keer per draft voordat je delta-gedrag verwacht. - Vermijd volledige route-regeneratie; gebruik
bp:routesom alleen ontbrekende routes toe te voegen.
Voor overige Blueprint-vragen: https://blueprint.laravelshift.com/docs/getting-started/