あるプロジェクトで使用されているブレードファイル内の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",
   ]

ということは、同じレベルに存在するサブフォルダーごとに再帰処理が必要となり、不可能でないものの少々ややこしいプログラムとなりますね。

By khino