Laravel:File::files($hoge)で取得した値がprivateで変数に出来ない時の対処法
Laravel:File::files($hoge)で取得した値がprivateで使えない
システムのDirectory内一覧を取得しようとFile関数を利用した時の事。取得した値がPrivateとなり変数として再利用できない。こんな場面に遭遇しました。
Fileの使用目的は画像データの一覧を取得したかったから。画像取得の速度を上げるために、システム内の画像の検索性を上げようと保存しているデータをDBに書いて仕舞えと思ったのですが、Fileで取得した値を再利用できない。
File::files($hoge)の結果を変数に入れる事が出来ない
#フォルダ内のファイルを配列で取得
$files = File::files($SearchFolder);
foreach($files as $file){
#ファイル名から拡張子を外す
$name = pathinfo($file->fileName());
#ファイル名を取得
$item_id = $name['filename'];
#パスを取得
$path = $file->path();
#ファイルサイズを取得
$filesize = File::size($path);
if($filesize == 0){
#ファイルサイズが0の場合、エラーと判断しファイルを削除
File::delete($path);
}else{
#DBに保存する
$item = new Imagefilelist;
$form = array(
'item_id' => $item_id
);
unset($form['_token']);
$item->fill($form)->save();
}
}
実行結果
Cannot access private property Symfony\Component\Finder\SplFileInfo::$relativePathname
どうやら「【File::】で取得した値はPrivate なのでアナタには使えません」と言われている様子。
そもそも取得できてないのか?と思い確認してみます。
var_dump() すると取得できている
var_dumpで確認するとPrivateと前置きをされていますが欲しい情報が取得できています。
でも使えなきゃ意味ないのだよ!
classのプロパティ―をPublic に 変更する?
いやいや、それ出来るとしてもあまりいい方法じゃないよね。
Getter を使うとちゃんと再利用できる!
上のスクリプトをこんな感じに変えました。
#フォルダ内のファイルを配列で取得
$files = File::files($SearchFolder);
foreach($files as $file){
#ファイル名から拡張子を外す
//$name = pathinfo($file->fileName()); ※修正前
$name = pathinfo($file->getfileName());//修正後
#ファイル名を取得
$item_id = $name['filename'];
#パスを取得
//$path = $file->path(); ※修正前
$path = $file->getpath();//修正後
#ファイルサイズを取得
$filesize = File::size($path);
if($filesize == 0){
#ファイルサイズが0の場合、エラーと判断しファイルを削除
File::delete($path);
}else{
#保存する
$item = new Imagefilelist;
$form = array(
'item_id' => $item_id
);
unset($form['_token']);
$item->fill($form)->save();
}
}
取得したいカラム名の前にgetを付けるだけ。
関数 File::files() は取得した値をobjectで返してくれます。
その為【$name = pathinfo($file->getfileName());】と言った感じになります。
まとめ
システムの関数を使い取得が出来ない値があった場合、Getterを使って取得を試みてみましょう。
さぁ、一時テーブル作ってあげたけど速度上がるかなぁ~。
速度が上がらなかったら、折角作ったけどお蔵入り。
システム作ってるとそんなことはよくありますよね。


