Door admins aanpasbare instellingen zonder complexe code
Apps kampen met een constant probleem. Sommige instellingen horen in een .env-bestand. Andere instellingen moeten via een beheerderspaneel kunnen worden gewijzigd zonder een nieuwe code-deploy. Voorbeelden hiervan zijn websitenaam, tijdzones of registratie-instellingen.
Veel ontwikkelaars slaan deze gegevens op in een database, maar creëren daarmee een puinhoop. Je eindigt met twee manieren om gegevens uit te lezen. Een deel van je app gebruikt config() terwijl een ander deel een databasemodel gebruikt. Dit leidt tot bugs waarbij instellingen inconsistent zijn.
Je kunt dit voorkomen door één enkel leespad te gebruiken. Behandel de database als een laag die je configuratie tijdens het opstarten overschrijft.
Zo bouw je het:
• Gebruik één enkele bron van waarheid (single source of truth). De database bevat de waarde, maar de applicatie leest deze alleen via config().
• Gebruik getypeerde klassen. Gebruik in plaats van losse arrays klassen met strikte types. Dit voorkomt typefouten en stille fouten.
• Laad instellingen tijdens het opstartproces. Gebruik een service provider om database-waarden op te halen en deze in de config-array te plaatsen.
Let op deze twee technische valkuilen:
De tijdzone-valkuil Laravel stelt de tijdzone vroeg in het opstartproces in. Als je de configuratiewaarde later wijzigt, gebruikt PHP nog steeds de oude tijdzone. Je moet
date_default_timezone_set()handmatig aanroepen om de globale PHP-instelling te synchroniseren met je nieuwe configuratiewaarde.De valkuil bij een schone installatie Een nieuwe app heeft nog geen databasetabellen. Als je opstartproces faalt omdat de instellingentabel ontbreekt, start de app niet op. Je kunt geen migrations uitvoeren als de app niet kan opstarten. Wikkel je instellingslogica in een
try/catch-blok. Hierdoor kan de app terugvallen op de .env-standaardwaarden totdat je je migrations hebt uitgevoerd.
Nog een tip voor de beveiliging: Wanneer je een functie zoals registratie uitschakelt, verberg dan niet alleen de knop in de gebruikersinterface (UI). Verwijder de functie volledig uit de configuratie. Als je de functie uit de configuratie verwijdert, verdwijnen ook de routes. Een verborgen formulier met een actief eindpunt is een beveiligingsrisico. Een ontbrekende route geeft een 404 terug.
Houd je code eenvoudig. Je controllers en views mogen niet weten of een instelling uit een bestand of uit een database komt. Ze zouden alleen config() moeten zien.
Bron: https://dev.to/nasrulhazim/admin-editable-settings-without-giving-up-config-2cj0
