Laravel9 langフォルダのメッセージをPHP/JavaScriptで共有したい。

/lang/ja/messages.phpを添付のように書いていたところ.
nodejsでコンパイル前のソースから同じ文言を共有したくなりました。

return [
    'login' => [
        'success' => 'ログインしました。',
        'fail' => 'ログインに失敗しました。'
    ],
];

そこで、/lang/ja/以下のPHPをJSONに変換してJavaScriptの定数のように使えるようにするコマンドを作成しました。

  • /lang/ja/以下のPHP
  • const ファイル名 という変数名になります。
  • とりあえず多言語化はしておらず、メッセージの定数管理のみ&JS側でIDEのコードヒントが出てほしいだけ
<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;

class YamaLabLangMesJsonCommand extends Command
{
    protected $signature = 'yamalab:lang_mes_json';
    protected $description = 'langファイル(PHP)をJSONに変換し保存';
    
    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        
        $langdir = base_path('lang/ja');
        if (is_dir($langdir)) {
            $files = scandir($langdir);
            if (!empty($files)) {
                $langjs = [];
                $files = array_filter($files, function ($f) {
                    return strpos($f, '.php') !== false;
                });
                foreach ($files as $f) {
                    $phpArr = include base_path("lang/ja/$f");
                    $json = json_encode($phpArr, JSON_UNESCAPED_UNICODE);
                    $name = str_replace('.php','.json',$f);
                    $varName = '__'.str($name)->replace('.json','')->upper().'__';
                    $row = sprintf('var %s = %s;',$varName,$json);
                    $langjs[] = $row; 
                }
                $langjs = implode("\n",$langjs);
                File::put(resource_path('js/lang.js'), $langjs);
            }
        }
        return Command::SUCCESS;
        
    }
    
}