Tại sao cần đưa biến env vào config trong Laravel ?

'Đưa env vào config đi', 'Tại sao lại không viết env biến vào trong config'. Chắc chắn đối với những bạn mới code và làm việc với Laravel, thì đã gặp những câu bình luận như trên của các anh "lớn" trong công ty và khi các bạn muốn thêm một môi trường biến thì đa số các bạn sẽ thêm một biến trong env rồi call in config nhưng không hiểu vì sao lại phải làm như thế, tại sao không gọi luôn env (...). Để làm rõ các vấn đề trên, hôm nay mình xin viết một bài blog nhỏ cho những ai chưa biết, còn trăn trở về các vấn đề, còn những người đã biết có thể bỏ qua và cho mình xin một like, một bình luận nếu có sai xót trong blog bài :D

Tổng quan nội dung

  1. Vấn đề.
  2. Giải đáp.
  3. Tài liệu tham khảo.

Vấn đề

Giả sử mình có một biến môi trường là SUGAR_DADDY=sugar_daddy trong env, bây giờ mình cần gọi biến SUGAR_DADDY trong project của thì phải làm thế nào?
Đến đây thì có người bảo: env('SUGAR_DADDY') là xong rồi :)), có người thì lại làm phức tạp hơn: định nghĩa vào trong một file config nào đó như thế này 'sugar_daddy' => env('SUGAR_DADDY', 'balabala') rồi dùng hàm config('sugar_daddy') để gọi trong project, ủa tại sao lại dài dòng như vậy, làm như thế làm gì cho nó mất công, nhưng đây lại là cách thường được mọi người dùng :)) tại sao lại như vậy...

Giải đáp

Trong trường hợp bạn chưa chạy lệnh php artisan config:cache thì hai cách gọi env(SUGAR_DADDY)config('sugar_daddy') đều cho bạn giá trị là sugar_daddy. Bây giờ bạn hãy thử chạy lệnh php artisan config:cache điều thần kì sẽ xảy ra, lúc này env(SUGAR_DADDY) sẽ cho kết quả là null còn config('sugar_daddy') = sugar_daddy

Nguyên nhân là do khi bạn chạy php artisan config:cache thì Laravel đã dịch tất cả file config thành một file config và được cache lại trong thư mục bootstrap/cache/ lúc này tất cả các cuộc gọi hàm env() đều cho kết quả là null (Do tệp env sẽ không được load nữa), còn khi gọi config('sugar_daddy') laravel sẽ vào file bootstrap/cache/config.php để tìm giá trị phù hợp với key là sugar_daddy nên sẽ có kết quả là sugar_daddy.

Câu hỏi đặt ra là:

  • Không chạy lệnh php artisan config:cache thì thế nào? Trong trường hợp này thì bạn gọi env hay config thì đều cho chung kết quả, vậy theo cá nhân mình thì dùng cái nào cũng được.
    Lý do tại sao lại nên dùng php artisan config:cache là để tăng tốc độ của ứng dụng, lúc này tất cả các file config sẽ được dịch và gộp thành một file duy nhất Laravel sẽ tải và đọc các cấu hình nhanh hơn => Trong các môi trường production nên cache các file config lại :)), Còn ở dưới môi trường local thì các bạn hạn chế dùng php artisan config:cache nhé không đến lúc debug không biết vì sao nó lại null mà trong khi đó mình đã set biến trong env rồi đặc biệt là các bạn mới làm quen với Laravel.
    => Nên đưa các biến env vào trong config để tăng tốc độ của ứng dùng và hạn chế lỗi xảy ra vì chẳng ai biết trên môi trường production có dùng php artisan config:cache hay không, đâu phải ai cũng vào được production để kiểm tra.

Tài liệu tham khảo

https://laravel.com/docs/9.x/configuration