13.x en de implementatie van Framework v13.37.0, en gaat dieper in op de basis van packageontwikkeling. Zie Blade voor de gewone templatesyntaxis en Views van packages overschrijven en bijwerken voor namespaces en het publiceren van views.
Scheid registreren, compileren en uitvoeren
De callback die je aanBlade::directive() doorgeeft, retourneert niet de waarde die getoond wordt, maar een string met de te genereren PHP-code. Ook het argument $expression is geen geëvalueerde waarde, maar de PHP-expressie zoals die in de template staat.
Ook
view:cache compileert. Ontwerp de genererende callback van een directive zo dat hij niet de huidige gebruiker ophaalt, niet naar de database schrijft en geen externe API’s aanroept.
Registreren onder een packagespecifieke naam
Als voorbeeld bieden we@acmeCourierLabel($code) aan, dat een geconfigureerd label vóór de verzendcode toont. We gaan ervan uit dat Acme\Courier\ via Composer PSR-4 aan src/ is gekoppeld en dat de provider via auto-discovery of handmatig wordt geregistreerd.
src/CourierServiceProvider.php
courier.label een string is en courier.enabled een boolean. Zie Packageconfiguratie samenvoegen en cachen voor het distribueren en samenvoegen van configuratiebestanden.
Registreer in de gewone boot() van de provider en plaats de registratie niet binnen een runningInConsole()-voorwaarde. Dezelfde extensies zijn nodig bij het renderen via HTTP en bij view:cache van Artisan. Maak een provider die alleen Blade-extensies registreert ook geen deferred provider die pas opstart wanneer een andere service wordt geresolved.
Argumenten komen binnen als expressie, niet als waarde
$code. De gegenereerde PHP ziet er als volgt uit.
config() en $code worden geëvalueerd op het moment dat deze PHP wordt uitgevoerd. Dat verschilt van een implementatie waarin de callback zelf config() leest en een vaste string retourneert.
De onderzochte callCustomDirective() verwijdert de buitenste haakjes, trimt de expressie en geeft die door aan de callback. De argumenten worden niet naar PHP-waarden omgezet en ook niet in afzonderlijke argumenten opgesplitst. Dit voorbeeld wordt gepubliceerd als syntaxis die precies één verplichte expressie accepteert.
Splits meerdere argumenten niet simpelweg met explode() op komma’s. Ook arrays, methodeaanroepen en stringliterals kunnen komma’s bevatten. Als je attributen of complexe HTML wilt verwerken, kun je de verantwoordelijkheden beter scheiden door een Blade-component aan te bieden.
Naamconflicten zijn ook een compatibiliteitsprobleem
directive() slaat de handler op in een array met de naam als sleutel. Bij dezelfde naam wordt de vorige registratie overschreven, en compileStatement() kiest eigen directives vóór de ingebouwde conversiemethoden. De officiële tests bevatten ook een geval waarin foreach met een eigen registratie wordt overschreven.
Vermijd algemene namen zoals label of enabled en ingebouwde namen, en gebruik een packagespecifiek prefix. Behandel de namen en argumenten die gebruikers in templates gebruiken als publieke API en lever een migratieprocedure bij wijzigingen.
Voorwaarden tijdens uitvoering beoordelen met Blade::if
De voorwaarde die in de bovenstaande provider is geregistreerd, kun je als volgt gebruiken.Blade::if() slaat de voorwaardecallback op en registreert directives voor het begin, unless, else en het einde. Het begin in dit voorbeeld wordt omgezet naar de volgende PHP.
check() aangeroepen. Het resultaat true of false wordt niet tijdens het compileren vastgelegd. Ook een HTTP-proces dat gecompileerde views gebruikt, moet de voorwaardecallback geregistreerd hebben.
Deze syntaxis schakelt alleen de weergave om en is geen autorisatie voor verzendbewerkingen. Voer toegangscontrole ook uit op de route of bij de bewerking zelf.
Een package-update genereert views niet altijd automatisch opnieuw
De onderzochteCompiler::isExpired() controleert of er een cache bestaat en, afhankelijk van de configuratie, de wijzigingstijden van de bronview en het gecompileerde bestand. Wijzigingen aan directives in de provider worden niet als afhankelijk bestand gevolgd.
Ook de officiële documentatie adviseert om na het wijzigen van de logica van een directive de cache te verwijderen met
view:clear. Voer dit uit in de deploymentstap van de gebruikende applicatie, nadat het bijgewerkte package en de views van de gebruiker op elkaar zijn afgestemd.
view:cache uit wanneer je in productie vooraf compileert. Wis de cache niet bij elke boot() van het package en pas de deploymentstappen van de gebruikende applicatie bij de installatie niet zonder toestemming aan. Volg ook voor het vernieuwen van de configuratiecache en het herladen van langlevende processen de normale deploymentprocedure van de omgeving.
Compilatieresultaat en renderresultaat afzonderlijk controleren
Controleer eerst de gegenereerde PHP in een Laravel-testapplicatie waarin de bovenstaande provider is geregistreerd. Hieronder staat een methode die je toevoegt aan een Feature-test dieTests\TestCase uitbreidt.
Gerelateerde pagina’s
Views van packages overschrijven en bijwerken
Bekijk de zoekvolgorde van namespaces en hoe je gepubliceerde templates onderhoudt.
Packagecaches integreren in optimize
Bekijk hoe je het opbouwen en wissen van eigen caches integreert in de deploymentstappen.
Geraadpleegde primaire bronnen
- Officiële Laravel-documentatie: Extending Blade en Custom if statements
- Officiële Laravel-documentatie: views en componenten van packages
- BladeCompiler: directive(), callCustomDirective(), compileStatement(), if() en check()
- Compiler: cachebeoordeling met isExpired()
- BladeCustomTest: eigen directives, voorwaarden en het overschrijven van ingebouwde syntaxis