Posted at

Laravelの環境変数で改行する

環境変数に公開鍵を登録しようとした際に、改行ができないものか調べたのでそのまとめです。


先に結論から


Laravel5.8以上の場合

念の為プロジェクトを作成して確認

$ composer create-project "laravel/laravel=5.8.*" laravel5.8

このように.envの中で改行をして記載することが可能です。

PUBLIC_KEY="-----BEGIN PUBLIC KEY-----

hogehoghoge
-----END PUBLIC KEY-----"

tinkerで確認をしてみても、下記のように取得ができています。

 [bunta.fujikawa]$ php artisan tinker

Psy Shell v0.9.9 (PHP 7.2.14 cli) by Justin Hileman
>>> env('PUBLIC_KEY');
=> """
-----BEGIN PUBLIC KEY-----
\n
hogehoghoge
\n
-----END PUBLIC KEY-----
"""


Laravel5.7以下の場合

同じく

$ composer create-project "laravel/laravel=5.7.*" laravel5.7

改行をしてみても取得ができていないです。

PUBLIC_KEY="-----BEGIN PUBLIC KEY-----

hogehoghoge
-----END PUBLIC KEY-----"

>>> env('PUBLIC_KEY');

=> "-----BEGIN PUBLIC KEY-----"

\n をenvのkeyに含めている記事もありましたが、そのままですね。

\n が通常の文字列の\nとして扱われているため、envからkeyを取得した上で改行を含めるようにする必要がありそうです。

>>> env('PUBLIC_KEY2');

=> "-----BEGIN PUBLIC KEY-----\nhogehoghoge\n-----END PUBLIC KEY-----"
>>> env('PUBLIC_KEY3');
=> "-----BEGIN PUBLIC KEY-----\nhogehoghoge\n-----END PUBLIC KEY-----"

PUBLIC_KEY2="-----BEGIN PUBLIC KEY-----\nhogehoghoge\n-----END PUBLIC KEY-----"

PUBLIC_KEY3="-----BEGIN PUBLIC KEY-----\\nhogehoghoge\\n-----END PUBLIC KEY-----"

改行前後に含まれる文字がわかっているので、envには改行文字を含めず、phpの正規表現を使って改行文字を含めるようにすれば良さそうです。

PUBLIC_KEY="-----BEGIN PUBLIC KEY-----hogehoghoge-----END PUBLIC KEY-----"

>>> $begin = '-----BEGIN PUBLIC KEY-----';

=> "-----BEGIN PUBLIC KEY-----"
>>> $end = '-----END PUBLIC KEY-----';
=> "-----END PUBLIC KEY-----"
>>>
>>> preg_match("/^$begin(.+)$end$/", env('PUBLIC_KEY'), $match);
=> 1
>>> $publicKey = implode(PHP_EOL, [$begin, $match[1], $end]);
=> """
-----BEGIN PUBLIC KEY-----
\n
hogehoghoge
\n
-----END PUBLIC KEY-----
"""


phpdotenvを使用している

laravelではphpdotenvというライブラリを使用しています。

こちらのライブラリで、環境変数の改行がサポートされたので、v3からのようです。

[3.0] First-class multiline string support

laravel5.8のプロジェクト作成時にインストールされるphpdotenvのバージョンがv3.4.0

- Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)

laravel5.7のプロジェクト作成時にインストールphpdotenvのバージョンがv2.6.1

- Installing vlucas/phpdotenv (v2.6.1): Loading from cache

そのためlaravel5.8ではenv内で改行ができて、5.7ではできなかったようです。