
- LaravelでServiceクラスを作成したい!
- ファットコントローラーを脱したい!
- データを取得するコードが書ける場所がほしい!
今回の記事ではこんな悩みを解決して行きます。
Laravelには予めControllerやViewのディレクトリが存在しますが、他のフレームワークでよくあるようなServiceディレクトリが存在しません。
そのため殆どの処理をコントローラーに書いてしまう方が多く、気づいたらコントローラーが肥大化しFat Controller(ファットコントローラー)と呼ばれる状態になってしまいます。
そこでこの様な状況にならないためのおすすめの方法としてServiceクラスを自分で作るというのがあります。
今回の記事ではServiceディレクトリを作成し、Serviceクラスを使うための手順をサンプルコードと共に解説をしていきます。
今までコントローラにしか書けなかったコードを適切にServiceに移し、より生産性の高いコードを書いていきましょう。
paiza転職ならプログラミングの実力を可視化できるから、
あなたの経験や希望に合った企業からスカウトが届きます
=> ITエンジニアの転職サイト【paiza】
目次
環境
今回の内容はPHPのバージョンやLaravelのバージョンに左右されることは無い想定ですが、念の為 動作確認した際のバージョンを記載します。
動作確認環境
- PHP 7.4.2
- Laravel Framework 6.13.1
Serviceクラスを追加する流れ
Serviceクラスを追加する際にはクラスファイルを作成する以外に、LaravelにServiceクラスを利用するための設定が必要です。
今回はそこも含めて解説をしていきます。
Serviceクラスを追加する流れ
- Servicesのディレクトリを作成
- Serviceクラスを作成
- AppServiceProviderに追記
- config.phpにAliasを追加
Serviceディレクトリの作成
初めてServiceクラスを作成する際には、ディレクトリが存在しないと思うので Services ディレクトリを作成しましょう。
作成場所は app ディレクトリの中で、 Console や Http と同じ階層に作成をします。
Servicesディレクトリを作成
Console
$ mkdir app/Services
作成後は下記のようなディレクトリ構成になればOKです。

Serviceクラスを作成
ディレクトリを作成したら、次に Services ディレクトリに作成したいクラスを追加しましょう。
今回は例として UserService を作成します。
Services/UserService.php
<?php
class UserService {
public function hoge()
{
echo "UserService hoge";
}
}
今回は例としてUserServiceに hoge メソッドを定義しました。

Servicesクラスを使えるようにする手順はこれだけ!
AppServiceProviderに追記
ここまでの内容でControllerやCommandなどからServiceクラスを呼び出すことは既に可能になっています。
しかし作成したServiceのクラスを他のクラスに対して依存注入(Dependency Injection)したい場合は、サービスプロバイダーを活用しサービスコンテナに登録しておく必要があります。
サービスコンテナに登録するための記述はAppServiceProvider.php の register メソッドにて行います。
app/Providers/AppServiceProvider.php
public function register()
{
$this->app->bind('App\Services\UserService'); // 追記
}
Facadeを作成してAliasを追加する
作成したServiceを呼び出す際に毎回 App\Services\UserService
を記述したり、 use App\Services\UserService
の様に記述するのは面倒だという人もいると思います。
そんな方はFacade(ファサード)クラスを作成し、Alias(エイリアス)を追加するのがおすすめです。
Aliasを追加する手順
- Facadesディレクトリを作成
- Serviceクラス用のFacadeファイルを作成
- Providerを作成
- config/app.phpにAliasを追記
Facadesディレクトリを作成
Serviceディレクトリと同様に、初めてFacadeクラスを追加する際にはディレクトリが存在しません。
そこでServiceクラスと同様の手順で Facades ディレクトリを作成しましょう
Console
$ mkdir app/Facades
Facadeファイルを作成
ディレクトリの作成が完了したら、次はService用のFacadeファイルを新規で作成していきます。
app/Facades/UserService.php
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class UserService extends Facade
{
protected static function getFacadeAccessor() {
return 'UserService';
}
}
クラス名と return する値は追加したServiceの名前と一致するようにしておきましょう。
Providerを作成する
続いてProviderを作成していきます。
Providerのスケルトンは php artisan コマンドで作成出来るので活用していきましょう。
Console
$ php artisan make:provider UserServiceProvider
ファイルの作成が完了すると app/Providers/UserServiceProvider.php
が作成されるので中身を編集していきます。
app/Providers/UserServiceProvider.php
public function register()
{
$this->app->bind(
'UserService', // キー名
'App\Services\UserService' // クラス名
);
}
UserServiceProvider.php
の register
の中身を上記の様に変更しましょう。
config/app.phpにAliasを追記
Facadeの追加まで終わったら最後に、 config/app.php
にエイリアスを貼っていきます
config/app.php
'providers' => [
// 略
App\Providers\UserServiceProvider::class,
],
'aliases' => [
// 略
'View' => Illuminate\Support\Facades\View::class,
'UserService' => App\Facades\UserService::class,
],
上記のコードを追加後は、useを記載しなくてもControllerなどで UserService::hoge();
の様に記述することが出来るようになります。
Serviceディレクトリは作成するべき
今回の記事ではLaravelでServiceディレクトリを追加する流れを解説してきました。
これは完全に個人的な意見ですが、Servicesディレクトリは出来る限り最初のうちに作っておくべきだと考えています。
もちろん命名は必ずしも Services
である必要はありませんが、この様なデータ取得のロジックなどを記述する場所がないとコントローラーが間違いなく肥大化していきます。
効率よく開発を行うためにも適切なコードをServiceに配置して健全な開発ライフを送っていきましょう。