> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Een Laravel starter kit maken

> Een praktische flow voor het maken van een Laravel starter kit, het publiceren ervan op Packagist en het continu bijhouden van versie-upgrades van Laravel en de frontend.

## Inleiding

Een starter kit is een templateproject dat via `create-project` wordt uitgerold wanneer je met `laravel new` een app maakt. Laravel 13 heeft vier officiële starter kits — React / Vue / Svelte / Livewire — inclusief authenticatie en een initiële UI.

Als je een eigen starter kit maakt, doe je precies hetzelfde: je richt een Laravel-app in als basis en publiceert die als Composer-package.

* Officiële documentatie: [Starter Kits](https://laravel.com/docs/starter-kits)
* Officieel implementatievoorbeeld: [laravel/react-starter-kit](https://github.com/laravel/react-starter-kit)
* Referentiepagina: [Laravel Console Starter](/nl/packages/laravel-console-starter/index)

## De starter kit maken

### Een Laravel-project initialiseren

Maak eerst het Laravel-project dat als template dient en ruim onnodige voorbeeldcode op. Geef vervolgens in `composer.json` een unieke packagenaam op bij `name`.

```json theme={null}
{
    "name": "example/starter-kit",
    "type": "project",
    "require": {
        "php": "^8.3",
        "laravel/framework": "^13.0"
    }
}
```

Deze `name` is de identifier die later wordt gebruikt bij `laravel new my-app --using=example/starter-kit`.

### De scripts in composer.json instellen

Na het uitvoeren van `laravel new` worden de Composer-scripts van de starter kit gebruikt voor de initialisatieflow. Zorg minimaal voor `post-root-package-install` en `post-create-project-cmd`.

```json theme={null}
"scripts": {
    "post-root-package-install": [
        "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
    ],
    "post-create-project-cmd": [
        "@php artisan key:generate --ansi",
        "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
        "@php artisan migrate --graceful --ansi"
    ]
}
```

Dit voorbeeld is gebaseerd op de [composer.json van laravel/react-starter-kit](https://github.com/laravel/react-starter-kit/blob/main/composer.json). Als je een database gebruikt, kun je het zo overnemen.

### Bepalen wat je distribueert met .gitattributes

Bestanden die je wel in de repository van de starter kit wilt hebben maar niet in het gegenereerde project van de gebruiker, sluit je uit met `export-ignore`.

```gitattributes theme={null}
LICENSE export-ignore
composer.lock export-ignore
README.md export-ignore
```

Zie het [officiële .gitattributes-voorbeeld](https://github.com/laravel/react-starter-kit/blob/main/.gitattributes) voor details.

## Registreren op Packagist

Om gebruikers de kit te laten gebruiken via `--using`, is registratie op Packagist nodig.

<Steps>
  <Step title="Zet een publieke repository op GitHub op">
    Publiceer met de `name` uit `composer.json` en de repository-URL op elkaar afgestemd.
  </Step>

  <Step title="Registreer op Packagist">
    Registreer de repository op [Packagist](https://packagist.org/). Na publicatie kan `example/starter-kit` worden opgelost.
  </Step>

  <Step title="Vermeld het gebruikscommando in de README">
    Vermeld voor gebruikers het volgende installatiecommando.

    ```bash theme={null}
    laravel new my-app --using=example/starter-kit
    ```
  </Step>
</Steps>

## De flow van het laravel new-commando

Het `NewCommand` van `laravel/installer` schakelt bij het opgeven van een starter kit de bestemming van `create-project` om en voert de initialisatiecommando's achter elkaar uit.

```mermaid theme={null}
flowchart TD
    A["laravel new my-app --using=example/starter-kit"] --> B["Packagenaam bepalen met getStarterKit()"]
    B --> C["composer create-project example/starter-kit my-app"]
    C --> D["composer run post-root-package-install -d my-app"]
    D --> E["Initialisatie zoals artisan key:generate"]
    E --> F["Zo nodig migrate / npm install uitvoeren"]
```

Interessante plekken in [NewCommand.php](https://github.com/laravel/installer/blob/master/src/NewCommand.php):

* [Definitie van de --using-optie](https://github.com/laravel/installer/blob/958a4e7c1386199a63d3c5e49a18b2e5c2ad1600/src/NewCommand.php#L119)
* [Uitvoering van `create-project` en `post-root-package-install`](https://github.com/laravel/installer/blob/958a4e7c1386199a63d3c5e49a18b2e5c2ad1600/src/NewCommand.php#L521-L569)
* [De implementatie van `getStarterKit()`](https://github.com/laravel/installer/blob/958a4e7c1386199a63d3c5e49a18b2e5c2ad1600/src/NewCommand.php#L1237-L1255)

## Een frontendframework kiezen

De officiële starter kits van Laravel 13 bieden React / Vue / Svelte / Livewire, maar een eigen starter kit hoeft zich niet aan die opzet te houden. Je mag CSS, component libraries en de authenticatiemethode vrij kiezen op basis van je doel.

| Optie                                     | Belangrijkste opzet                                   | Geschikt voor                                                        |
| ----------------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------- |
| Officieel React / Vue / Svelte / Livewire | De officiële opzet met Inertia 3 of Livewire 4        | Een ontwikkelervaring bieden die dicht bij het officiële aanbod ligt |
| Eigen frontend                            | Willekeurige CSS of component library                 | Een bestaand designsysteem of andere CSS-basis gebruiken             |
| Eenvoudige Blade-kit                      | Blade-centrisch, minimale frontenddependencies        | Snel aan de slag met een lichtgewicht opzet                          |
| Eigen authenticatiekit                    | Niet beperkt tot Fortify (bijv. gericht op Socialite) | Je wilt je richten op een specifieke authenticatiemethode            |

<Info>
  Community-starterkits kiezen vaak een andere CSS-basis dan de officiële kits. Ga ook bij authenticatie niet standaard uit van Fortify, maar ontwerp op basis van je vereisten.
</Info>

## Onderhoud bij versie-upgrades

Een starter kit is niet "klaar na het maken". Je beweegt continu mee met updates van Laravel en PHP.

### Omgaan met Laravel- en PHP-upgrades

Werk eerst de vereisten in `composer.json` bij en controleer de compatibiliteit in CI.

```json theme={null}
"require": {
    "php": "^8.3",
    "laravel/framework": "^13.0"
}
```

Bij een Laravel-major herzie je `laravel/framework` en de omliggende dependencies tegelijk.

### Regelmatige updates van dependencies

Frontenddependencies veranderen snel, dus het is veilig om maandelijks een updatetaak te draaien.

* Tailwind
* Component libraries (shadcn/ui, shadcn-vue, shadcn-svelte, Flux UI)
* Inertia- / Livewire-gerelateerde packages

### Compatibiliteitstests

Neem minimaal de volgende controles op in je CI:

* `composer install` slaagt
* `php artisan test` slaagt
* `npm install && npm run build` slaagt

## Best practices

* **Leg `name` vroeg vast**: wijzigen na publicatie op Packagist is kostbaar.
* **Baseer scripts op de officiële voorbeelden**: als je de initialisatieflow breekt, nemen installatiefouten toe.
* **Richt `.gitattributes` meteen in**: dat vermindert ruis bij het distribueren van de template.
* **Maak upgrades een routine**: richt je proces zo in dat je direct na een Laravel-release kunt volgen.
* **Lees de gerelateerde gidsen erbij**: [De basis van packageontwikkeling](/nl/advanced/package-development) en [Versiecompatibiliteit van packages beheren](/nl/advanced/package-versioning) samen lezen maakt je ontwerp stabieler.


## Related topics

- [Starter kits](/nl/starter-kits.md)
- [Laravel Maestro — de orchestrator voor starter kit-ontwikkeling](/nl/blog/maestro-introduction.md)
- [Introductie React — de basis voor Inertia × Laravel](/nl/blog/react-introduction.md)
- [Introductie Svelte — de basis voor Inertia × Laravel](/nl/blog/svelte-introduction.md)
- [Introductie Vue.js — de basis voor Inertia × Laravel](/nl/blog/vue-introduction.md)
