【Composer】【Laravel】Laravelのプロジェクトディレクトリ内に独自クラスファイルを追加する方法

Laravelの機能やPHPの組み合わせれば大概の機能は実装できますし、Laravel側で仕様が決まっているので綺麗にかけます。
しかし、時には再現できない機能を実現するために自分でクラスを書いて追加したい時があります。

Laravelの場合、php artisanで関連するファイルのテンプレートを用意できます。
その中には、自作クラスを含めるためのオプションは用意されていません。
(もちろん、php artisanで実行できるコマンドを自作する事も可能です。 )

さて、
今回は、自作ライブラリを読み込めるようにするための方法について触れます。

尚、前述したように、この方法はLaravelの公式に載っている方法ではなく、一般的なPHPやComposerの使い方を応用したものです。
記事内の命名は独自のものですので、検索してもおそらく出てきません。

環境

環境名 バージョン
laravel 5.8

構成

今回は、seederで使う機能を実装する場合の構成です。
laravelのプロジェクトディレクトリの中にLibraryと言うディレクトリを用意して、その中に自作クラスを格納します。
自作クラスのファイル名はSeederHelper.phpとします。

laravel_project_dir
├── app
│   ├── seeds
│   │  ├── UsersTableSeeder.php
│   │  └── master
│   │      └── users_init_data.csv
│   └── Library
│       └── SeederHelper.php
└── composer.json

クラスファイルを作成する

Libraryディレクトリ直下に、SeederHelper.phpと言うファイルを用意しSeederHelperクラスを実装します。

<?php

namespace App\Library;

class SeederHelper
{
    public function saveDB()
    {
        // 処理を書く
    }
}

composerのclassmapに追加

自作したクラスも別コントローラーや処理ファイルで使えるようにする方法です。
Laravel自体 、composerからライブラリを読み込んでいますので、その読み込み先に自作クラスのディレクトリを含める方法で実装します。

composerにはclassmapと言う設定があります。
getcomposer.org classmapとはautoloadの初期読み込み設定で、対象のディレクトリを含める事でuseで参照できるようになります。

What does it do? Class map generation essentially converts PSR-4/PSR-0 rules into classmap rules. This makes everything quite a bit faster as for known classes the class map returns instantly the path, and Composer can guarantee the class is in there so there is no filesystem check needed.
https://getcomposer.org/doc/articles/autoloader-optimization.md#optimization-level-1-class-map-generationより引用

設定方法

プロジェクトディレクトリ直下に格納されている、composer.jsonのautoload->classmapを次のように設定します。

下記には、設定が必要な箇所のみ抽出した設定を記述します。
もし、autoloadを開発環境用と本番環境用に分けていて、どちらでも使いたい場合は、autoload-devにも追加します

{
    "config": {
        "optimize-autoloader": true,
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/Library"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        },
        "classmap": [
            "app/Library"
        ]
    },
}

composerの最適化

最後に、composerを最適化します。

$ composer dump-autoload -o

別ファイル内でクラスを使用する

実際に使う場合は、他のライブラリと同様にuseで指定します。
下記のように設定する事で自作クラスが読み込めるようになります。

<?php

use Illuminate\Database\Seeder;
use App\Library\SeederHelper;

class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $users = new SeederHelper();
        $users->saveDB();
    }
}

エディタで関数が読み込めない事についての雑感

エディタやIDEによっては、クラスファイルに関数ジャンプが出来ない場合があります。

この方法で実行できる事は確認できていますので、関数の設定に誤りは無いと思われます。
Indexを更新する事で検索が出来るようになる可能性もありますので気になるようであれば試してみてください。

©︎2017-2018 WebSandBag