自分だけのクイズ作成 - Quipha公開中

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

Laravel
スポンサーリンク

はじめに

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

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

Laravelの構築方法は以下をご覧ください。

使用するバージョン
  • Laravel Framework 8.69.0

Quipha

個人開発ですがQuiphaというサービスを開発しました。
Webアプリケーションであり、LaravelとVue3(Composition APIも使用)で作成しました。

良かったら、会員登録して動作を試してみて下さい。

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上のコードがエラーになってしまします。
(試したことがありませんが、おそらくVS Codeに限らず、他のIDEも同じではないでしょうか)

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

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

問題2

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

問題3

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

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

スポンサーリンク

laravel-ide-helperの導入

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

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

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

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

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

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

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

php artisan ide-helper:generate

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

_ide_helper.php

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

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

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

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

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

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

さいごに

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

コメント

タイトルとURLをコピーしました