laravel怎么修改.env

laravel修改.env的方法:1、通過“base_path(‘.env’);”獲取env文件的路徑;2、通過“function updateEnv($data = Array()){}”聲明函數(shù);3、通過“$pattern = ‘/([^=]*)=[^n]*/’;”正則匹配的方式來修改解析env文件即可。

laravel怎么修改.env

本教程操作環(huán)境:Windows7系統(tǒng)、Laravel5.7版、Dell G3電腦。

laravel怎么修改.env?

Laravel 動態(tài)修改 env 環(huán)境變量的值!

引言

為了把配置參數(shù)獨立出來,用以區(qū)分開發(fā)環(huán)境,線上環(huán)境等功能, 或者手動切換緩存的驅(qū)動,隊列的驅(qū)動,郵件服務(wù)器地址,等等等等, 這些可以方便地標(biāo)記。所以laravel使用 .env 文件包裹這些配置數(shù)據(jù),也就是鍵值對。

學(xué)習(xí)時間

一般情況下,我們不允許修改env文件的內(nèi)容,除非手動處理。可是在編程中難免遇到非修改不可的情況, 那么又該如何動態(tài)地操作env文件內(nèi)的鍵值對呢?

假設(shè)對于系統(tǒng)使用 key:generate 生成的 APP_KEY 不安全,在做自動化部署,批量部署時有動態(tài)修改 APP_KEY 這個鍵的需求。該怎么來實現(xiàn)呢?

其實,env文件不過是一個文本文件,遵循 key=value 這樣的標(biāo)準(zhǔn)格式進(jìn)行書寫,全程使用字符串匹配, 單行直到換行符停止。

那么修改 env 文件內(nèi)容,無非就是找到相關(guān)的鍵,然后將值替換掉,如此而已。

下面給出第一個版本,也就是簡單粗暴的 file_put_contents,先獲取env文件的路徑:

$path?=?base_path('.env');

需要判斷文件是否存在:

if?(file_exists($path)){ ????//?文件存在 }

文件存在則先讀出文件的所有內(nèi)容到一個字符串變量內(nèi):

$origin?=?file_get_contents($path);

假設(shè)我們的新 APP_KEY 存在變量 $new_key 內(nèi),首先獲取原始的 APP_KEY的值:

$old_key?=?env('APP_KEY');

字符串操作當(dāng)然要使用字符串替換函數(shù)直接匹配,我們使用 str_replace,env文件的數(shù)據(jù)量畢竟不大, 這么也也沒有太大性能的問題。

$result?=?str_replace('APP_KEY='?.?$old_key,?$new_key,?$origin);

這樣$result內(nèi)存儲的就是最新的env文件的值,接下來寫入env文件就行了:

file_put_contents($result);

默認(rèn)是覆寫,所以執(zhí)行完程序,env文件就是最新的動態(tài)修改的數(shù)據(jù)了。

深入一步

上面的代碼還是有瑕疵的,因為對于錯誤故障處理基本上沒有,這很容易造成錯誤。 另外對于env這么重要的文件操作,直接使用字符串替換,整個文件的讀和覆寫, 本身的風(fēng)險就非常高。

如何改造我們的操作方式,使其更為安全呢?我們需要兼容性更好的代碼。本節(jié)我們嘗試使用正則匹配的方式, 來解析env文件,并逐行讀取,逐行操作,逐行判斷, 對于存在的鍵值,進(jìn)行覆蓋;對于不存在的,則進(jìn)行創(chuàng)建。 這樣就可以兼容新建和更新兩種功能,且支持的鍵值更為靈活。

封裝為助手函數(shù),假設(shè)傳入的參數(shù)為數(shù)組,且是關(guān)聯(lián)數(shù)組。聲明函數(shù)如下:

function?updateEnv($data?=?array()){}

函數(shù)體內(nèi)書寫邏輯,首先非空判斷:

if?(!?count($data))?{return;}

如果不是關(guān)聯(lián)數(shù)組,也同樣不接受,因為env文件必須明確指定鍵和值。 關(guān)聯(lián)數(shù)組只用判斷數(shù)組的鍵與自動序列化的鍵不同即可:

if?(array_keys($data)?===?range(0,?count($data)?-?1))?{return;}

準(zhǔn)備匹配模式:

$pattern?=?'/([^=]*)=[^n]*/';

這就是env文件書寫的格式。上一節(jié)我們已經(jīng)介紹過了。我們把舊的env文件讀入一個數(shù)組,并聲明新的數(shù)組,存儲最新的配置文件數(shù)據(jù):

$envFile?=?base_path()?.?'/.env'; $lines?=?file($envFile); $newLines?=?[];

然后遍歷舊的文件數(shù)據(jù),逐行解析:

foreach?($lines?as?$line)?{ ????preg_match($pattern,?$line,?$matches); ????if?(!count($matches))?{ ????????$newLines[]?=?$line; ????????continue; ????} ????if?(!key_exists(trim($matches[1]),?$data))?{ ????????$newLines[]?=?$line; ????????continue; ????} ????$line?=?trim($matches[1])?.?"={$data[trim($matches[1])]}n"; ????$newLines[]?=?$line; }

上面只是一個大致的處理流程,這個解析過程,你可以獨立為自定義函數(shù),或者其他解析引擎,具有通用性。

最后把解析完的新數(shù)據(jù),完整寫入env文件內(nèi):

$newContent?=?implode('',?$newLines); file_put_contents($envFile,?$newContent);

至此,env文件的更新操作就完成了。

寫在最后

本文通過兩種方式實現(xiàn)了在程序內(nèi)動態(tài)創(chuàng)建和更新env全局配置文件文件數(shù)據(jù)的功能, 第二種方法容錯性更好,具有通用性,擴(kuò)展性強(qiáng),所以我們推薦。 第一種做法沒有錯誤處理,生產(chǎn)環(huán)境下幾乎不能用。大家知道思路就好了。

推薦學(xué)習(xí):《laravel視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊13 分享