Laravel | Cấu hình nhiều file môi trường (.env)
Đầu tiên cần tham khảo trước về cấu hình môi trường trong Laravel tại đây
Để sử dụng các biến môi trường, lúc tạo dự án laravel đã tự tạo ra cho ta file .env đây là file chứa các biến môi trường chung cho toàn dự án.
Đó là trường hợp bạn chỉ chạy dự án đó trên một môi trường duy nhất (chẳng hạn bạn chạy dưới local).
Tuy nhiên thực tế với một dự án ta sẽ chạy trên nhiều môi trường khác nhau như là môi trường lúc development (đang phát triển), staging (để test gần giống với môi trường thật nhất), production (môi trường thật đang chạy cho user cuối).
Mục lục
1. Chạy trên nhiều file môi trường
Vậy trong bài này ta sẽ giải quyết vấn đề này như sau:
Giả sử dự án của bạn chạy trên 2 môi trường là dev và production và thực tế nó chạy trên 2 domain lần lượt là dev.domain.com và product.domain.com
Đầu tiên tạo thêm 2 file môi trường như sau ở thư mục gốc:
.env.dev và .env.production

Mở file /bootstap/app.php
-> Chúng ta sẽ thêm đoạn code sau vào cuối file trước khi gọi lệnh return $app;
if ($_SERVER['HTTP_HOST'] == 'production.domain.com') {
// thiết lập file môi trường production
$dotenv = Dotenv\Dotenv::createMutable($app->environmentPath(),'.env.production');
} else {
// thiết lập file môi trường dev
$dotenv = Dotenv\Dotenv::createMutable($app->environmentPath(),'.env.dev');
}
// tiến hành overloading
$dotenv->load();
Trong đó:
$app->environmentPath() -> lấy đường dẫn môi trường hiện tại đang được sử dụng (mặc định là nằm cùng cấp thư mục gốc).
Dotenv\Dotenv::createMutable(path, file_name) -> tạo thiết lập môi trường với đường dẫn và tên file mới.
** Chú ý: createMutable() thì mình có thể thay đổi các biến môi trường, còn với createImmutable() thì không thể. Tham khảo thêm phpdotenv.
$dotenv->load() -> tiến hành overloading file môi trường mới.
OK đến đây là xong.
** Chú ý: Các biến khai báo trong file môi trường gốc .env và file mới không nhất thiết phải giống nhau về số lượng biến.
Nếu file môi trường mới không có biến cần lấy thì nó sẽ tìm trong file .env gốc.
2. Thay đổi đường dẫn và tên file môi trường mặc định
Mặc định file môi trường mặc định của laravel tự tạo ra là file .env nằm ở thư mục gốc của dự án.
Trong laravel ta có thể thay đổi đường dẫn chứa file .env và cũng có thể thay đổi tên file mặc định của nó thành bất kỳ tên gì với đuôi extension là gì và không bắt buộc phải có ‘.env’ trong tên file. Tuy nhiên thường không ai làm vậy có đổi thì cũng đổi tên kiểu như .master.env hay .dev.env hay .env.dev kiểu vậy.
Và bây giờ giả sử mình sẽ thay đổi đường dẫn chứa file môi trường mặc định vào “/[thư mục gốc]/env/” và tên file gốc bây giờ sẽ là .master.env không còn là .env nữa.

Mở file /bootstap/app.php thêm như sau
/**
* master config
*/
$app->useEnvironmentPath(__DIR__.'/../env');
$app->loadEnvironmentFrom('.master.env');
Trong đó :
$app->useEnvironmentPath() -> thay đổi đường dẫn chứa file môi trường mặc định.
$app->loadEnvironmentFrom() -> thay đổi file môi trường gốc.
Đến đây là ta có thể thay đổi được path và file name của môi trường gốc.
Còn đây là toàn bộ code của việc vừa đổi path, file name môi trường gốc vừa overloading nhiều file môi trường khác nhau:
/**
* master config
*/
$app->useEnvironmentPath(__DIR__.'/../env');
$app->loadEnvironmentFrom('.master.env');
if ($_SERVER['HTTP_HOST'] == 'production.domain.com') {
// thiết lập file môi trường production
$dotenv = Dotenv\Dotenv::createMutable($app->environmentPath(),'.env.production');
} else {
// thiết lập file môi trường dev
$dotenv = Dotenv\Dotenv::createMutable($app->environmentPath(),'.env.dev');
}
// tiến hành overloading
$dotenv->load();
3. Tham khảo
https://laravel.com/docs/8.x/configuration#environment-configuration
https://stackoverflow.com/questions/38823145/laravel-custom-env-file