概要
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.json
の autoload.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"
こんな感じです。