\ 楽天市場 お買い物マラソン開催中 /

LaravelでServiceクラスを作成する手順まとめ!FacadeやProviderの作り方も解説!

4 min 319 views
LaravelでServiceクラスを 作成する手順まとめ! FacadeやProviderの作り方も解説!
himakuro

himakuro

新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、オンラインで未経験者の方にプログラミングを指導しています。

FOLLOW

https://himakuro.com/wp-content/uploads/2020/02/boy-programming.png

  • LaravelでServiceクラスを作成したい!
  • ファットコントローラーを脱したい!
  • データを取得するコードが書ける場所がほしい!

今回の記事ではこんな悩みを解決して行きます。

Laravelには予めControllerやViewのディレクトリが存在しますが、他のフレームワークでよくあるようなServiceディレクトリが存在しません。

そのため殆どの処理をコントローラーに書いてしまう方が多く、気づいたらコントローラーが肥大化しFat Controller(ファットコントローラー)と呼ばれる状態になってしまいます。

そこでこの様な状況にならないためのおすすめの方法としてServiceクラスを自分で作るというのがあります。

今回の記事ではServiceディレクトリを作成し、Serviceクラスを使うための手順をサンプルコードと共に解説をしていきます。

今までコントローラにしか書けなかったコードを適切にServiceに移し、より生産性の高いコードを書いていきましょう。



環境

今回の内容は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です。

Laravel - servicesディレクトリ

Serviceクラスを作成

ディレクトリを作成したら、次に Services ディレクトリに作成したいクラスを追加しましょう。

今回は例として UserService を作成します。

Services/UserService.php

<?php
class UserService {
    public function hoge()
    {
        echo "UserService hoge";
    }
}

今回は例としてUserServiceに hoge メソッドを定義しました。

https://himakuro.com/wp-content/uploads/2018/12/himakuro-happy-reverse.png

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.phpregisterの中身を上記の様に変更しましょう。

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に配置して健全な開発ライフを送っていきましょう。

himakuro

himakuro

新卒で入社したブラック企業から脱出して超ホワイトな会社に転職。エンジニア歴は7年で普段はウェブサービス作ったりブログを書いたり、オンラインで未経験者の方にプログラミングを指導しています。

FOLLOW

カテゴリー:
関連記事

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です