あるプロジェクトで使用されているブレードファイル内のHTML文の置換が必要となりました。aritisanコマンドを作成して、resources/viewsのファイル1つずつオープンして上書きが必要です。さて、問題はサブフォルダーやサブサブフォルダーがあるフォルダーからどうやってファイル名を取得するか。
resources/viewsのフォルダー
まずは、treeコマンドで目的のフォルダー内を見てみます。
resources/views
├── auth
│ ├── confirm-password.blade.php
│ ├── forgot-password.blade.php
│ ├── login.blade.php
│ ├── passwords
│ │ ├── confirm.blade.php
│ │ ├── email.blade.php
│ │ └── reset.blade.php
│ ├── register.blade.php
│ ├── reset-password.blade.php
│ ├── verify.blade.php
│ └── verify-email.blade.php
├── dashboard.blade.php
├── home.blade.php
├── layouts
│ ├── app.blade.php
│ ├── guest.blade.php
│ └── navigation.blade.php
├── test.blade.php
├── user
│ └── search.blade.php
├── vendor
│ └── pagination
│ ├── bootstrap-4.blade.php
│ ├── default.blade.php
│ ├── semantic-ui.blade.php
│ ├── simple-bootstrap-4.blade.php
│ ├── simple-default.blade.php
│ ├── simple-tailwind.blade.php
│ └── tailwind.blade.php
└── welcome.blade.php
結構ネストされていますね。
ここのblade.phpファイルをすべて取得するのが今回のゴールです。
Webmozart Glob
調査すると、もうすでに素晴らしいパッケージがこのためにありました。
$ composer require webmozart/glob
とパッケージをインストールして、tinkerで実行します。
>>> Glob::glob(base_path('resources/views/**/*.blade.php'));
=> [
"/var/www/repos/l8x/resources/views/auth/confirm-password.blade.php",
"/var/www/repos/l8x/resources/views/auth/forgot-password.blade.php",
"/var/www/repos/l8x/resources/views/auth/login.blade.php",
"/var/www/repos/l8x/resources/views/auth/passwords/confirm.blade.php",
"/var/www/repos/l8x/resources/views/auth/passwords/email.blade.php",
"/var/www/repos/l8x/resources/views/auth/passwords/reset.blade.php",
"/var/www/repos/l8x/resources/views/auth/register.blade.php",
"/var/www/repos/l8x/resources/views/auth/reset-password.blade.php",
"/var/www/repos/l8x/resources/views/auth/verify-email.blade.php",
"/var/www/repos/l8x/resources/views/auth/verify.blade.php",
"/var/www/repos/l8x/resources/views/dashboard.blade.php",
"/var/www/repos/l8x/resources/views/home.blade.php",
"/var/www/repos/l8x/resources/views/layouts/app.blade.php",
"/var/www/repos/l8x/resources/views/layouts/guest.blade.php",
"/var/www/repos/l8x/resources/views/layouts/navigation.blade.php",
"/var/www/repos/l8x/resources/views/test.blade.php",
"/var/www/repos/l8x/resources/views/user/search.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/bootstrap-4.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/default.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/semantic-ui.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/simple-bootstrap-4.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/simple-default.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/simple-tailwind.blade.php",
"/var/www/repos/l8x/resources/views/vendor/pagination/tailwind.blade.php",
"/var/www/repos/l8x/resources/views/welcome.blade.php",
]
素晴らしい!
フィルターをかけている部分の /**/ は、resources/views/以下のフォルダーとサブフォルダー(階層OK)にマッチします。そして、 *.blade.php は、拡張子が.blade.phpのファイルとマッチします。
phpのglob関数との違い
フォルダー内のファイル名を取得する関数はすでにphpの標準関数としてglob()がありますが、先のパッケージのglobと違って1レベルのフォルダーしか対応しません。
つまり、
>>> glob('resources/views/*.blade.php')
=> [
"resources/views/dashboard.blade.php",
"resources/views/home.blade.php",
"resources/views/test.blade.php",
"resources/views/welcome.blade.php",
]
>>> glob('resources/views/*/*.blade.php')
=> [
"resources/views/auth/confirm-password.blade.php",
"resources/views/auth/forgot-password.blade.php",
"resources/views/auth/login.blade.php",
"resources/views/auth/register.blade.php",
"resources/views/auth/reset-password.blade.php",
"resources/views/auth/verify-email.blade.php",
"resources/views/auth/verify.blade.php",
"resources/views/layouts/app.blade.php",
"resources/views/layouts/guest.blade.php",
"resources/views/layouts/navigation.blade.php",
"resources/views/user/search.blade.php",
]
>>> glob('resources/views/*/*/*.blade.php')
=> [
"resources/views/auth/passwords/confirm.blade.php",
"resources/views/auth/passwords/email.blade.php",
"resources/views/auth/passwords/reset.blade.php",
"resources/views/vendor/pagination/bootstrap-4.blade.php",
"resources/views/vendor/pagination/default.blade.php",
"resources/views/vendor/pagination/semantic-ui.blade.php",
"resources/views/vendor/pagination/simple-bootstrap-4.blade.php",
"resources/views/vendor/pagination/simple-default.blade.php",
"resources/views/vendor/pagination/simple-tailwind.blade.php",
"resources/views/vendor/pagination/tailwind.blade.php",
]
ということは、同じレベルに存在するサブフォルダーごとに再帰処理が必要となり、不可能でないものの少々ややこしいプログラムとなりますね。