首頁  >  文章  >  php框架  >  laravel怎麼修改.env

laravel怎麼修改.env

藏色散人
藏色散人原創
2022-12-12 10:18:041950瀏覽

laravel修改.env的方法:1、透過「base_path('.env');」取得env檔案的路徑;2、透過「function updateEnv($data = array()){}」聲明函數;3、以「$pattern = '/([^\=]*)\=[^\n]*/';」正規匹配的方式來修改解析env檔案即可。

laravel怎麼修改.env

本教學操作環境:Windows7系統、Laravel5.7版、Dell G3電腦。

laravel怎麼修改.env?

Laravel 動態修改 env 環境變數的值!

引言

為了把設定參數獨立出來,用以區分開發環境,線上環境等功能, 或手動切換快取的驅動,佇列的驅動,郵件伺服器位址,等等等等, 這些可以方便標示。所以laravel使用 .env 檔案包裹這些配置數據,也就是鍵值對。

學習時間

一般情況下,我們不允許修改env檔案的內容,除非手動處理。可是程式設計中難免遇到非修改不可的情況, 那麼又該如何動態地操作env檔內的鍵值對呢?

假設對於系統使用 key:generate 產生的 APP_KEY 不安全,在做自動化部署,批量部署時有動態修改 APP_KEY 這個鍵的需求。該怎麼來實現呢?

其實,env文件不過是一個文字文件,遵循 key=value 這樣的標準格式進行書寫,全程使用字串匹配, 單行直到換行符停止。

那麼修改 env 檔案內容,無非就是找到相關的鍵,然後將值替換掉,如此而已。

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

$path = base_path('.env');

需要判斷檔案是否存在:

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

檔案存在則先讀出檔案的所有內容到一個字串變數內:

$origin = file_get_contents($path);

假設我們的新APP_KEY 存在變數$new_key 內,先取得原始的APP_KEY的值:

$old_key = env('APP_KEY');

字串操作當然要使用字串替換函數直接匹配,我們使用str_replace,env檔案的資料量畢竟不大, 這麼也沒有太大效能的問題。

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

這樣$result內儲存的就是最新的env檔的值,接下來寫入env檔就行了:

file_put_contents($result);

預設是覆寫,所以執行完程序,env檔就是最新的動態修改的數據了。

深入一步

上面的程式碼還是有瑕疵的,因為對於錯誤故障處理基本上沒有,這很容易造成錯誤。另外對於env這麼重要的文件操作,直接使用字串替換,整個文件的讀取和覆蓋, 本身的風險就非常高。

如何改造我們的操作方式,使其更安全呢?我們需要相容性更好的程式碼。本節我們嘗試使用正規匹配的方式, 來解析env文件,並逐行讀取,逐行操作,逐行判斷, 對於存在的鍵值,進行覆蓋;對於不存在的,則進行創建。這樣就可以相容新建和更新兩種功能,且支援的鍵值更為靈活。

封裝為助手函數,假設傳入的參數為數組,且是關聯數組。宣告函數如下:

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

函數體內書寫邏輯,首先非空判斷:

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

如果不是關聯數組,也同樣不接受,因為env檔案必須明確指定鍵和值。關聯數組只用判斷數組的鍵與自動序列化的鍵不同即可:

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

準備匹配模式:

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

這就是env文件書寫的格式。上一節我們已經介紹過了。我們把舊的env檔案讀入一個數組,並聲明新的數組,儲存最新的設定檔資料:

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

然後遍歷舊的檔案數據,逐行解析:

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;
}

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

最後把解析完的新數據,完整寫入env檔內:

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

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

寫在最後

本文透過兩種方式實現了在程式內動態建立和更新env全域設定檔檔案資料的功能, 第二種方法容錯性較好,具有通用性,擴展性強,所以我們推薦。第一種做法沒有錯誤處理,生產環境下幾乎不能用。大家知道思路就好了。

推薦學習:《laravel影片教學

以上是laravel怎麼修改.env的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn