🔎

Laravelで画面に表示されたviewのファイル名を特定する

2024/01/18に公開

※この記事は2022年1月に個人ブログで投稿した「キャッシュ前のviewファイル名を確認する」をベースに書き直しました。個人ブログは現在閉鎖しています。

はじめに

皆さんはあるコンポーネントを修正したい場合、どうやってそのコンポーネントのファイルを特定してますか?
クラス名やキーワードから、プロジェクト内を検索してシラミ潰すのも効果的ですが、検索に引っかからないと特定に時間がかかって面倒です。Chromeの開発ツールでファイル名を確認しようにも、キャッシュされたファイル名が出てきてしまい、もとのファイルがわからないことがありました。そんなときに使える、キャッシュされる前のすべてのviewファイル名をdumpする方法をご紹介します。

対象読者

  • Laravel を使っている、画面のあるプロジェクトに参加している方。

要約

/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.phpget($path, $data)$pathをdumpすると確認できる。

詳細

まずは、 CompilerEngine.php を開きます。以下のコマンドで見つかります。

$ find . | grep Illuminate/View/Engines/CompilerEngine.php

// ↓ 結果、以下に存在することがわかった
// /lab/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php

ファイルが見つかったら、 get($path, $data)$path を dmup します。

    /**
     * Get the evaluated contents of the view.
     *
     * @param  string  $path
     * @param  array  $data
     * @return string
     */
    public function get($path, array $data = [])
    {
        $this->lastCompiled[] = $path;

        // If this given view has expired, which means it has simply been edited since
        // it was last compiled, we will re-compile the views so we can evaluate a
        // fresh copy of the view. We'll pass the compiler the path of the view.
        if ($this->compiler->isExpired($path)) {
            $this->compiler->compile($path);
        }

        // Once we have the path to the compiled file, we will evaluate the paths with
        // typical PHP just like any other templates. We also keep a stack of views
        // which have been rendered for right exception messages to be generated.
        $results = $this->evaluatePath($this->compiler->getCompiledPath($path), $data);

        array_pop($this->lastCompiled);
+       dump($path);
        return $results;
    }

以下のように、画面上部にviewファイルのpathが表示されます!

どうなってるの?

このget()関数は、 view がキャッシュされる前に必ず通るようになっています。
なので、$pathを見ればそのファイル名がdumpできるというわけです。

ハック的な方法なので、別の良いやり方あったら教えてください。

Discussion