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を使って取得を試みてみましょう。

さぁ、一時テーブル作ってあげたけど速度上がるかなぁ~。
速度が上がらなかったら、折角作ったけどお蔵入り。
システム作ってるとそんなことはよくありますよね。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください