自分だけのクイズを作成しよう - Quipha
スポンサーリンク

【Laravel】エイリアスをVS Codeでエラー解消・ジャンプ・補完

Laravel

当サイトではアフィリエイト広告を利用しています。

スポンサーリンク

はじめに

Laravelではエイリアスという便利な機能があります。
不要な記述を避けることができますが、実行には問題なくても、開発時にVS CodeなどのIDEで使う場合には問題があります。

今回はその問題を解決するための手順をまとめました。

Laravel Sailでの開発環境の構築方法は以下をご覧ください。

Windows
Mac
使用するバージョン
  • Windows 11 or macOS Monterey (M1)
  • Laravel Framework 8 or 9 or 10

2022/10/02 WindowsとMacを使い、最新バージョンで確認しました。
2023/03/11 Laravel10で確認しました。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

スポンサーリンク

【紹介】個人開発

私の個人開発ですがQuiphaというサービスを開発しました。(Laravel, Vue3など)
良かったら、会員登録して動作を試してみて下さい。

また、Laravel 9 実践入門という書籍を出版しました。
Kindle Unlimitedを契約している方であれば、読み放題で無料でご覧いただくことができます

是非多くの方に読んでいただき、Laravelの開発に少しでもお役に立てたら幸いです。

Laravelのエイリアスとは

エイリアスの概要

Laravelプロジェクトの、以下のファイルを確認してみましょう。

config\app.php

エイリアスの定義を確認します。
ファサードクラス等が定義してあります。

    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'Date' => Illuminate\Support\Facades\Date::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Http' => Illuminate\Support\Facades\Http::class,
        'Js' => Illuminate\Support\Js::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        // 'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'Str' => Illuminate\Support\Str::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,

    ],

エイリアスに登録しないと、useにクラスのパスを宣言する必要があります。
コントローラ内で、デバッグログを出力する処理を記述してみましょう。

<?php

namespace App\Http\Controllers;

// 使用するクラスを宣言
use Illuminate\Support\Facades\Log;

class HomeController extends Controller
{
    /**
     * index
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        Log::debug('ログを出力!');

        return view('home');
    }
}

このように、Laravelが用意しているファサードや、よく使うクラスのパスを毎回宣言するのは面倒ですよね。

use Illuminate\Support\Facades\Log;

Laravelではデフォルトでエイリアスに登録されているため、以下の宣言でも大丈夫です。

use Log;

もっと言えば、useの宣言は不要で、クラス名の前にバックスラッシュを記述するだけで使用することができます。

\Log::debug('ログを出力!');

先程のコードは以下のようになります。スッキリしました。

<?php

namespace App\Http\Controllers;

class HomeController extends Controller
{
    /**
     * index
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        \Log::debug('ログを出力!');

        return view('home');
    }
}

エイリアスに登録されているクラスはこのように扱うことができます。

問題1

実行は問題なくできますが、VS Code上のコードがエラーになってしまします。

これは指定されているクラスを、IDEが捕捉できていないためです。

本当にコーディングミスをしているエラーと、区別がつかなくなります。

問題2

問題1と絡みますが、そのクラスのメソッドやプロパティを、コード補完できないことです。
また、PHPDocが確認できないため、引数や戻り値などをすぐに確認できません。
コーディングしている際に、正確に打ち込まないといけないし、別途、関数の仕様を調べないといけないのは非常に効率が悪いです。

問題3

実装に直接ジャンプできないことです。
例えば自分で作成したファサードクラスがあり、関数の実装へジャンプしたいケースがありますが、わざわざGrep検索などで探すしかありません。

折角エイリアスに登録したのに、IDE上で問題があるので結局useに定義・・、それだと意味がありませんよね。

スポンサーリンク

laravel-ide-helperの導入

これらの問題を解決するためには、laravel-ide-helperを導入しましょう。

GitHub - barryvdh/laravel-ide-helper: IDE Helper for Laravel
IDE Helper for Laravel. Contribute to barryvdh/laravel-ide-helper development by creating an account on GitHub.

以下のコマンドで、Composerでインストールします。

$ sail composer require --dev barryvdh/laravel-ide-helper

composer.jsonに以下が追加されました。

    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.13",
...
    },

以下のコマンドを実行して、ファサードの情報を自動生成しましょう。

$ sail php artisan ide-helper:generate

プロジェクト直下に以下のファイルが作成されました。作業はこれだけです。

_ide_helper.php

先程のコードを見てみましょう。クラス名にバックスラッシュを追加したコードがエラーになっていません。(useの宣言はしていない)

きちんとファサードクラスの関数のPHPDocが表示されました。

コード補完もバッチリ動作しています。

Ctrlキーを押しながら、クリックすることでジャンプもできました。
一度、_ide_helper.phpの方へジャンプします。

自動生成されたファイルですので、更に、該当の関数をCtrlキーを押しながらクリックすることで、実際の実装へジャンプすることができました。

自分でファサードクラスを実装した場合でも、ide-helper:generateを実行すれば、同じように動作します。

その他

初学者へ

Laravelを初めて触る方へ向け、手順やアドバイスをまとめました。

外部サーバーへ公開

作成したアプリは公開して使ってもらいましょう!
Laravelアプリケーションを外部公開する方法をまとめました。

脆弱性対策

脆弱性を抱えたアプリケーションの場合、攻撃を受ける可能性があり大変危険です。
作成したアプリケーションは、脆弱性対策も意識しましょう。

GitHubと連携

GitHubと連携する方法を解説しました。
プロジェクトの管理はGitHubを活用しましょう。

GitHub Copilot

GitHub Copilotを導入し、AIにコーディングをサポートしてもらうこともできます。

さいごに

エイリアスを活用しなるべく不要な記述をせず、開発効率が上がると思いますので、是非活用してみてください。

他にも私のブログで、Laravelについて解説している記事がありますのでご覧ください。

\オススメ/

コメント