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

# Views van packages overschrijven en bijwerken

> Aan de hand van de implementatie in Laravel 13: de zoekvolgorde van views met namespace, het onderhoud van gepubliceerde Blade-templates en het verschil tussen de viewcache en de cache van zoekresultaten.

Bij een package waarvan gebruikers de templates voor schermen of e-mails kunnen aanpassen, volstaat het niet om alleen de views te publiceren. Je hebt ook een afspraak nodig waarmee je het package kunt bijwerken terwijl de gepubliceerde bestanden blijven bestaan. Als je een Blade-bestand in het package aanpast, betekent dat niet automatisch dat de applicatie van de gebruiker dat bestand ook rendert.

Deze pagina bouwt voort op [Laravel-packages ontwikkelen](/nl/advanced/package-development) en behandelt de keuze van views, het publiceren van bestanden en caching als afzonderlijke onderwerpen. Als officiële documentatie is Laravel 13 gebruikt en voor de implementatie van het framework de nieuwste release `v13.34.0`.

## Registreren en publiceren zijn afzonderlijke processen

`loadViewsFrom()` registreert zoekpaden bij een namespace. `publishes()` registreert een bron en een bestemming; het daadwerkelijke kopiëren gebeurt door `vendor:publish`. In het volgende voorbeeld kun je `courier::deliveries.show` ook zonder publiceren gebruiken.

```php src/CourierServiceProvider.php theme={null}
<?php

namespace Acme\Courier;

use Illuminate\Support\ServiceProvider;

class CourierServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->loadViewsFrom(__DIR__.'/../resources/views', 'courier');

        $this->publishes([
            __DIR__.'/../resources/views' => resource_path('views/vendor/courier'),
        ], 'courier-views');
    }
}
```

Het bestand van het package plaats je in `resources/views/deliveries/show.blade.php`. De punten in de viewnaam worden bij het zoeken omgezet in mapscheidingstekens.

```php theme={null}
return view('courier::deliveries.show', [
    'trackingCode' => 'TRACK-001',
]);
```

```blade resources/views/deliveries/show.blade.php theme={null}
<p>Trackingnummer: {{ $trackingCode }}</p>
```

De namespace van een view staat los van de Composer-packagenaam en de PHP-namespace. Hier vormt `courier`, het tweede argument van `loadViewsFrom()`, de afspraak voor viewverwijzingen en voor de map waarin overschrijvingen staan.

## Per bestand naar overschrijvingen zoeken

Wanneer `view` wordt geresolved, controleert `ServiceProvider::loadViewsFrom()` de paden in de configuratie `view.paths` op volgorde. Bestaat in een pad de map `vendor/courier`, dan wordt die map aan de namespace toegevoegd. Als laatste wordt het pad van het package toegevoegd.

`FileViewFinder` doorzoekt de paden van die namespace op volgorde en retourneert het eerste bestand dat wordt gevonden. Bij een opzet met de standaard `resources/views` is de volgorde als volgt.

```mermaid theme={null}
flowchart TD
    A["courier::deliveries.show"] --> B["Zoeken naar resources/views/vendor/courier/<br>deliveries/show.blade.php"]
    B --> C{"Bestaat het bestand?"}
    C -->|Ja| D["View van de applicatie gebruiken"]
    C -->|Nee| E["Zoeken naar resources/views/<br>deliveries/show.blade.php van het package"]
    E --> F{"Bestaat het bestand?"}
    F -->|Ja| G["View van het package gebruiken"]
    F -->|Nee| H["Exceptie: view niet gevonden"]
```

Dit is geen omschakeling van de hele map. Ook als een gebruiker alleen `deliveries/show.blade.php` overschrijft, worden de andere, niet-overschreven views uit het package geladen.

| Situatie in de applicatie | Gekozen view |
| - | - |
| Geen overschrijvend bestand | Het bestand van het package |
| Overschrijvend bestand met hetzelfde relatieve pad | Het bestand van de applicatie |
| Alleen het overschrijvende bestand verwijderd | Valt bij een nieuwe start terug op het bestand van het package |
| Het bestand ontbreekt op beide plekken | Exceptie `View [...] not found.` |

<Info>
  Bij een opzet met meerdere `view.paths` kunnen er ook meerdere locaties voor overschrijvingen zijn. `resource_path('views/vendor/courier')` is in dit voorbeeld de publicatiebestemming, maar beperkt het zoeken niet tot alleen die locatie. Gebruik een package-specifieke namespace en vermijd een ontwerp waarin meerdere providers paden aan dezelfde naam toevoegen.
</Info>

## Alleen de benodigde views aanpassen

Gebruikers kunnen de templates kopiëren met het volgende commando. Geef de provider en de tag op, zodat er geen andere resources worden meegenomen.

```bash theme={null}
php artisan vendor:publish --provider="Acme\Courier\CourierServiceProvider" --tag=courier-views
```

Met deze registratie wordt de hele viewsmap gepubliceerd. Als niet alles overschreven hoeft te worden, kun je de inhoud controleren en alleen de bestanden bewaren die je aanpast, of alleen de benodigde bestanden handmatig naar hetzelfde relatieve pad kopiëren. Ook een onbewerkte kopie geldt namelijk als overschrijving zolang die bestaat.

<Warning>
  Gepubliceerde templates worden niet automatisch gesynchroniseerd met updates van het package. Als een oude kopie voorrang krijgt en je alleen het package aanpast, worden de wijzigingen in die view niet doorgevoerd. Ook bij het oplossen van weergavefouten of het wijzigen van formulieren moet je vergelijken met de overschrijvende bestanden.
</Warning>

### Opnieuw publiceren voegt geen verschillen samen

`VendorPublishCommand` slaat het kopiëren normaal over als er al een bestand met dezelfde naam op de bestemming staat. `--force` overschrijft bestaande bestanden. Ook `--existing` is een optie om "gepubliceerde bestanden te overschrijven" en geen modus die de bewerkingen van gebruikers behoudt.

| Handeling | Gevolg voor viewbestanden |
| - | - |
| Gewoon opnieuw publiceren | Bestaande bestanden blijven behouden; ontbrekende bestanden worden gekopieerd |
| Publiceren met `--force` | Ook bestaande aanpassingen worden overschreven |
| Publiceren met `--existing` | Alleen bestanden die al op de bestemming staan worden overschreven |

Geen van deze methoden is een merge waarbij de oude versie, de nieuwe versie en de bewerkingen van de gebruiker worden vergeleken. Ook worden views die uit het package zijn verwijderd niet automatisch van de bestemming verwijderd. Maak van de updateprocedure dus niet "gewoon dezelfde tag opnieuw publiceren".

## Ook views onderhouden als publieke API

Niet alleen de viewnamen, maar ook de ontvangen data en de onderdelen waarnaar wordt verwezen hebben invloed op de aanpassingen van gebruikers. Als je bijvoorbeeld in een nieuwe versie `trackingCode` een andere variabelenaam geeft, krijgen gebruikers die een oude template hebben behouden niet meer de benodigde waarde van de nieuwe code.

Controleer vóór een release de volgende afspraken.

* Wijzig de namespace en viewnamen zoals `deliveries.show` niet zonder goede reden.
* Leg de doorgegeven variabelen, hun types en of ze verplicht of optioneel zijn vast.
* Neem ook de verwijzingen van `@include` en `@extends` en de props van Blade-componenten mee in de wijzigingen.
* Vermeld in de release notes welke views zijn aangepast en welke wijzigingen op gepubliceerde oude versies moeten worden toegepast.

Bied gebruikers een procedure om de oude en nieuwe views van het package te vergelijken en de benodigde wijzigingen handmatig over te nemen in hun aangepaste bestanden. Bestanden die niet meer overschreven hoeven te worden, kun je verwijderen nadat je de wijzigingen hebt veiliggesteld met een back-up of versiebeheer. Dan wordt weer de view van het package gebruikt.

## De Blade-cache werkt overschrijvende bestanden niet bij

`view:cache` compileert Blade-templates vooraf naar PHP. `ViewCacheCommand` voert eerst `view:clear` uit en verzamelt daarna de gewone viewpaden en de paden die bij namespaces zijn geregistreerd om de te compileren bestanden te vinden.

```bash theme={null}
php artisan view:cache
```

Dit proces herschrijft geen gepubliceerde Blade-bestanden en verandert de zoekvolgorde van views niet. Bestaat er een oud overschrijvend bestand, dan wordt dat bestand ook na het opnieuw opbouwen van de cache gekozen. Compileer bij een deployment pas nadat de code en de overschrijvende bestanden zijn bijgewerkt.

Wil je tijdens de ontwikkeling de gecompileerde bestanden verwijderen en opnieuw renderen, gebruik dan het volgende commando.

```bash theme={null}
php artisan view:clear
```

Als de gewone timestampcontrole is ingeschakeld, vergelijkt de Blade-compiler de wijzigingstijd van het bronbestand met die van het gecompileerde bestand. Omdat er ook opzetten zijn waarin de timestampcontrole is uitgeschakeld, moet je het opnieuw opbouwen bij een deployment niet alleen aan deze automatische detectie overlaten.

### Onderscheid met de cache van zoekresultaten

`FileViewFinder::find()` slaat gevonden paden op in de array `$views` van die Finder-instantie. Daarnaast wordt het bestaan van de overschrijvingsmap gecontroleerd in de callback van `loadViewsFrom()`. Een map die je na het opstarten toevoegt, wordt dus niet automatisch aan de al geregistreerde zoekpaden toegevoegd.

| Wat wordt beheerd | Rol | Aanpak bij updates |
| - | - | - |
| Gepubliceerde Blade-bestanden | Aanpassingen van de gebruiker | Verschillen overnemen of de overschrijving opheffen |
| Gecompileerde PHP | Resultaat van Blade-compilatie | Beheren met `view:cache` / `view:clear` |
| Geregistreerde paden en zoekresultaten van de Finder | Viewkeuze van de draaiende instantie | Langlopende processen herstarten met de nieuwe code en configuratie |

`view:clear` is geen commando dat in één keer de Finder-status wist die door andere draaiende processen wordt vastgehouden. Laad langlopende processen zoals Octane opnieuw volgens je gewone deploymentprocedure. `flush()` van de Finder wist de zoekresultaten, maar registreert geen nieuwe overschrijvingsmappen.

## Wat je vóór een release controleert

Controleer naast de tests van het package de volgende combinaties in een applicatie die het package gebruikt. Een test die alleen de nieuwste templates rendert, verifieert niet de compatibiliteit voor gebruikers die een oude versie hebben gepubliceerd.

* Zonder publicatie worden de views van het package gerenderd.
* Als je één bestand overschrijft, krijgt alleen dat bestand voorrang en vallen de andere terug op het package.
* Ook met behouden gepubliceerde templates van een oude versie kan worden gerenderd met de data die de nieuwe versie doorgeeft.
* Bij gewoon opnieuw publiceren blijven aanpassingen behouden en worden niet-gepubliceerde bestanden zoals bedoeld toegevoegd.
* Na het wijzigen van overschrijvende bestanden slaagt `view:cache` en toont een nieuwe start de gewijzigde weergave.

## Gerelateerde pagina's

<Columns cols={2}>
  <Card title="Views" icon="eye" href="/nl/views">
    Bekijk de basis van het maken van views, het doorgeven van data en het vooraf compileren.
  </Card>

  <Card title="Blade-templates" icon="code" href="/nl/blade">
    Bekijk hoe je layouts, includes en componenten gebruikt.
  </Card>

  <Card title="Versiecompatibiliteit beheren" icon="code-branch" href="/nl/advanced/package-versioning">
    Koppel wijzigingen in de afspraken van templates aan je releasebeleid.
  </Card>

  <Card title="Octane" icon="bolt" href="/nl/octane">
    Bekijk de levenscyclus en het herladen van langlopende applicaties.
  </Card>
</Columns>

## Geraadpleegde primaire bronnen

* [Officiële Laravel-documentatie: views van packages](https://github.com/laravel/docs/blob/156fc7fde114548640e13c39aa79b991291c3f91/packages.md#views)
* [ServiceProvider: registratie van viewpaden](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Support/ServiceProvider.php)
* [FileViewFinder: zoekvolgorde en het bewaren van zoekresultaten](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/View/FileViewFinder.php)
* [VendorPublishCommand: voorwaarden voor het publiceren van bestanden](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Foundation/Console/VendorPublishCommand.php)
* [ViewCacheCommand: verzamelen van viewpaden en compileren](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Foundation/Console/ViewCacheCommand.php)
* [ViewClearCommand: verwijderen van gecompileerde bestanden](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/Foundation/Console/ViewClearCommand.php)
* [Compiler: controle van wijzigingstijden](https://github.com/laravel/framework/blob/v13.34.0/src/Illuminate/View/Compilers/Compiler.php)


## Related topics

- [Laravel-packages ontwikkelen](/nl/advanced/package-development.md)
- [Geavanceerde onderwerpen](/nl/advanced/index.md)
- [Migrations van packages publiceren en bijwerken](/nl/advanced/package-migrations.md)
- [Configuratie](/nl/configuration.md)
- [Versiecompatibiliteit van packages beheren](/nl/advanced/package-versioning.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.