bu .env meselesini anlamak için şöyle bir açıklama yapayım.Zira kafalarda hep bir sorun oluşuyor soru soran arkadaşlar için.
Env laravel için ortam değişkenleri demektir.Bunu da birazdan yazacağım 3 sınıfla set ediliyor.
Öncelikle laravel env yönetemi için
https://github.com/vlucas/phpdotenv
bu paketi kullandığını bilmemiz gerekiyor.
Laravel boot sürecinde ilk olarak environment sınıfını yükler.
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Http/Kernel.php#L37
yani bu demek oluyor ki daha providerlar bile yüklenmeden hatta ve hatta configurasyon bile yüklenmeden bu environment başlatılıyor.
Peki ne yapıyor.Uzun uzadıya anlatmak yersiz.Bizim için ipucu verecek kısım şurası
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L92
bu satırda gördüğünüz gibi..Laravel environment yönetimi için sadece 3 sınıf kullanıyor...
EnvConstAdapter,ServerConstAdapter,PutenvAdapter
Bu sınıflar şuradadır.
https://github.com/vlucas/phpdotenv/tree/master/src/Environment/Adapter
aslında görüldüğü gibi extradan 2 sınıf daha kullanılabilirmiş.Array ve Apache adapterleri.
Bu sınıfların icine girdiğinizde;
- EnvConstAdapter sınıfı $_ENV ile ilgili global environment değişkenine set ve get ile sorumludur.
- ServerConstAdapter sınıfı $_SERVER ile ilgili global environment değişkenine set ve get ile sorumludur.
- PutenvAdapter sınıfı putenv ve getenv ile ilgili global environment değişkenine set ve get ile sorumludur.
tüm mesele budur aslında.Laravel bu 3 sınıfa set ve get yapıyor yani
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L89
bu linkte işaretlediğim satırda..create yaparken aslında environmentPath olarak dizin yolu ve environment dosyası olan .env dosyasının icindekileri tek tek bu sınıflara set ediyor.
Peki nasıl derseniz;
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L32
bu linkteki işaretlediğim satır aslında takip ettiğinizde en nihai olarak
https://github.com/vlucas/phpdotenv/blob/master/src/Environment/DotenvVariables.php#L68
burada işaretlediğim yere gelir ve tüm adapterler olan sınıflara set yapar.
bütün mesele ana hattıyla bu kadar...
Yani siz .env dosyanızda foo = bar diye bir değer koyduğunuzda..aslında $_SERVER,$_ENV,getenv olarak kayıt yapmıs olursunuz.
.env
foo=bar
$_SERVER['foo'] // bar
$_ENV['foo'] //bar
getenv('foo') //bar
diye ulaşırsınız..hepsi aynıdır..
Laravelin yardımcı methodu olarak env() kullanır..
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/helpers.php#L641
oda burada işaretlediğim composer vasıtasıyla yüklediği helpers dosyası.
aslında env('foo',1); yaptıgınızda $variables olarak factory ettiği yine 3 sınıfı çağıyor ve get yapıyor..
$variables->get($key)
eğer 3 factory de de bulamazsa 2.parametre olarak verilen 1 değerini baz alır...
Env yönetimi genel hatlarıyla bu.
Dikkat edilmesi gereken husus,bu dosya düz bir dosyadır ve eğer izinler doğru verilmezse güvenlik açığı oluşturur.
o yüzden 2.parametre olarak verilen değer çok önemlidir.Yani .env de yoksa bu değeri kullan diye..bu da su demektir.Yani .env dosyası laravel icin zorunlu değildir ve proda gitmemesi gereken bir dosyadır aslında.
.env de olmayan bir xxx değer için şöyle yaptığımızda...
$_SERVER['xxx'] = 'yyy';
$a = env("xxx",1);
dd($a); //yyy
Son olarak env() yardımcısından talep ettiğiniz her değer mutlaka string olmak zorundadır.
ornegin :
.env
1 = true
code
env(1,false); // exception alırsınız
env('1',false) // doğru olan budur.
Kolay gelsin iyi çalışmalar.