あるプロジェクトで使用されているブレードファイル内の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", ]
ということは、同じレベルに存在するサブフォルダーごとに再帰処理が必要となり、不可能でないものの少々ややこしいプログラムとなりますね。
メルマガ購読の申し込みはこちらから。