LoginSignup
7
6

More than 1 year has passed since last update.

Laravel ルートディレクトリに packages ディレクトリを配置する

Last updated at Posted at 2021-02-19

概要

Laravelのappディレクトリ配下であれば、自作のPHPクラスやディレクトリを掘って行っても自動的に認識されるのでその場合は特別な設定は不要です。
Laravelのルートディレクトリに、Laravelのコードと明確に分けて自作のPHPクラスを定義したいという時のtipsです。

ディレクトリ構成

.
├── app # Laravel関連のコード
├── bootstrap
├── config
├── database
├── packages # 追加する自作のPHPクラス
│   └── Acme
│       └── Service
│           └── HogeService.php
├── public
├── resources
├── routes
├── storage
├── tests
├── vendor # Laravel本体のコード
├── composer.json
└── composer.lock

今回は Acme\Service\HogeService クラスを登録します。

補足: Acme について
架空のルーニーテューンズ社を指すみたいです。また、「最高点」を意味します。
https://en.wikipedia.org/wiki/Acme_Corporation

Acme はSymfony2の頃にプレースホルダーとして使用されていました。(今は違うかも)
Laravelの App と被らないから良いなと思って今回採用してます。(Acme の代わりにプロジェクト名にするのも良いかなと思います)

登録方法

composer.jsonautoload.psr-4 のキーに "Acme\\": "packages/Acme", を追加します。

composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Acme\\": "packages/Acme",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },

packages 内にクラスを作る

$ mkdir -p packages/Acme/Service
$ touch packages/Acme/Service/HogeService.php
<?php declare(strict_types=1);

namespace Acme\Service;

final class HogeService
{
    /**
     * @return string
     */
    public function handle(): string
    {
        return 'hogehoge';
    }
}

オートローダー更新

$ composer dump-autoload

tinkerを実行して追加したクラスが認識されればokです。

$ php artisan tinker

>>> $hogeService = app()->make(Acme\Service\HogeService::class);
=> Acme\Service\HogeService {#4569}

>>> $hogeService->handle();
=> "hogehoge"

Acme\Foo\Bar クラスがLaravelに認識されるようになったのでokです。
一度オートローダーが作られてしまえば、以降作られるファイルは自動で認識されるようになります。

$ touch packages/Acme/Service/FugaService.php
<?php declare(strict_types=1);

namespace Acme\Service;

final class FugaService
{
    /**
     * @return string
     */
    public function handle(): string
    {
        return 'fugafuga';
    }
}
$ php artisan tinker

>>> $fugaService = app()->make(Acme\Service\FugaService::class);
=> Acme\Service\FugaService {#4567}

>>> $fugaService->handle();
=> "fugafuga"

こんな感じです。

参考

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6