Δεν πρέπει ποτέ να χρησιμοποιείτε το env() εκτός μέσα από τα config files (config/*.php)

Πριν 3 χρόνια μου έτυχε μια περίπτωση σε Laravel στην οποία η live εφαρμογή δε λειτουργούσε. Συγκεκριμένα "έσκαγε" όταν προσπαθούσε να κάνει μια κλήση με guzzle σε ένα url. Το url η εφαρμογή το διάβαζε φυσικά από το .env αρχείο. Τοπικά λειτουργούσε μια χαρά (είναι η κατάρα όλα να λειτουργούν μια χαρά τοπικά και να μη λειτουργούν σε live περιβάλλον). Στο server όμως δε λειτουργούσε με τίποτα. 

Τελικά, το πρόβλημα ήταν πως στο σημείο του κώδικα που γινόταν η κλήση στο url, ο προηγούμενος προγραμματιστής διάβαζε τη μεταβλητή για το url με τη βοηθητική συνάρτηση env('URL') αντί να ρωτάει τα config αρχεία με την κατάλληλη εντολή πχ config('myconfig.url'). Γιατί όμως μπορεί να συμβεί αυτό; Τι σχέση έχει το σημείο από το οποίο θα διαβάσει η Laravel μια μεταβλητή.

Για να εξηγηθεί θα πρέπει να καταλάβουμε τι κάνει η Laravel για λόγους optimization. Είναι σύνηθες όταν κάνουμε deploy μια εφαρμογή σε production περιβάλλον, για να έχουμε καλύτερη απόδοση να τρέχουμε την εντολή php artisan config:cache. Η εντολή αυτή μαζεύει όλες τις μεταβλητές σε ένα μόνο αρχείο ώστε να κάνει το επιθυμητό optimization. Όμως ταυτόχρονα κάνει και κάτι ακόμα.

Με την εκτέλεση της παραπάνω εντολής η Laravel σταματάει να διαβάζει το .env αρχείο. Και είναι λογικό να το κάνει αυτό αφού όλες οι απαραίτητες μεταβλητές για να λειτουργήσει η εφαρμογή ΠΡΕΠΕΙ να υπάρχουν σε config αρχεία.

Άρα ένας βασικός κανόνας για την ανάπτυξη εφαρμογών στη Laravel είναι να χρησιμοποιούμε την εντολή env ΜΟΝΟ μέσα σε config αρχεία και ΠΟΤΕ μέσα στο κώδικα μας. Γιατί αν δεν το κάνουμε μπορεί να δουλεύει στην αρχή ή τοπικά αλλά όταν κάποιος αποφασίσει πως θέλει καλύτερο performance και εκτελέσει τα προβλεπόμενα για το framework της Laravel θα έχουμε κρεμάσει την εφαρμογή μας χωρίς λόγο.