環境変数に公開鍵を登録しようとした際に、改行ができないものか調べたのでそのまとめです。
先に結論から
Laravel5.8以上の場合
念の為プロジェクトを作成して確認
$ composer create-project "laravel/laravel=5.8.*" laravel5.8
このように.envの中で改行をして記載することが可能です。
PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
hogehoghoge
-----END PUBLIC KEY-----"
tinkerで確認をしてみても、下記のように取得ができています。
$ 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ではできなかったようです。