4
4

More than 1 year has passed since last update.

【Laravel】サービスプロバイダとは、使い方や作成方法

Posted at

プロバイダというのは提供者という意味です。

今回はサービスコンテナにサービスを登録する仕組みを紹介していきます。
※サービスコンテナについてわからない方は以下の記事も見ておくと理解力が深まると思います。

参考記事「readouble.com

サービスプロバイダには大きく分けて2つ

register()boot()というメソッドがあって

register()の中でapp()サービスコンテナにサービスを登録して

boot()の方で全てのサービスを登録した後に実行したい処理を書くという流れになります。

サービスプロバイダの使い方

サービスプロバイダが記述されている場所

config > app.php

'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

    ],

137行目あたりに'providers' => []という配列がありこの中にサービスプロバイダがいくつも記載されております。

Laravelを表示するタイミングでこれらのサービスプロバイダが読み込まれます。

今回は簡単なサービスプロバイダを実際に使ってみようと思います。

暗号系のサービスプロバイダ

Illuminate\Encryption\EncryptionServiceProvider::class,

こちらが暗号系のサービスプロバイダで簡単に使用できるので試しに使っていきましょう。

こちらのファイルは以下に存在しています。

vendor > laravel > framework > src > illuminate > Encryption > EncryptionServiceProvider.php

このクラスの中にregister()というメソッドがあります。

public function register()
    {
        $this->registerEncrypter(); //ここ
        $this->registerOpisSecurityKey();
        $this->registerSerializableClosureSecurityKey();
    }

こちらは、サービスコンテナに登録するための処理が書かれています。

例えば、$this->registerEncrypter();の処理を見ていきます。

protected function registerEncrypter()
    {
        $this->app->singleton('encrypter', function ($app) {
            $config = $app->make('config')->get('app');

            return new Encrypter($this->parseKey($config), $config['cipher']);
        });
    }

このようにコードが記載されており、app->singleton('encrypter'でサービスコンテナにencrypterという名前で登録していることがわかります。

実際に以下でencrypterを簡単に使用してみることにします。

ルーティングの作成

最初にルーティングファイルから作ることにします。

routes > web.php

use App\Http\Controllers\LifeCycleController;

Route::get('/provider', [LifeCycleController::class, 'showServiceProvider']);

web.phpに記述する事ができたらコントローラーを作成していきます。

コントローラーの作成

次にターミナルで以下を実行してコントローラーを作成していきます。

php artisan make:controller LifeCycleController

上で作成したLifeCycleControllerは以下の場所に作成されます。

app > Http > Controllers > LifeCycleController

上のコントローラーが確認できたらOKです!

実際にコードを書いていく

app > Http > Controllers > LifeCycleController

class LifeCycleController extends Controller
{
    public function showServiceProvider()
    {
        $encrypt = app()->make('encrypter');
        $password = $encrypt->encrypt('password');
        dd($password, $encrypt->decrypt($password));
    }

app()->make()でサービスを使うことができて、サービス名を'encrypter'としています。

上の処理でインスタンスして$encryptの中のencrypt()メソッドで'password'という文字列を暗号化しています。

$encrypt->decrypt()を使用すると複合化してくれます。「暗号化した物を元に戻す」

表示結果

以下ように表示されていればOK!

20230709_01.png

上がencrypt()メソッドでパスワードを暗号化しているのがわかります。

下がdecrypt()メソッドで暗号化されたパスワードを元に戻しているのがわかります。

サービスプロバイダを自身で作成する方法「説明のみ」

サービスプロバイダを作成するには以下の専用のコマンドを使用していきます。

php artisan make:provider ServiceProvider

ServiceProviderの箇所はクラス名

作成したProviderは以下の箇所に存在します。

app > Providers > ServiceProvider

class ServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

register()の方で登録される処理を書いていきます。

register()を実際に使用するために

config > app.php

の中にある’providers’ ⇒ []の配列の中の一番下に以下を追加します。

App\Providers\ServiceProvider::class

これでブラウザを再読み込みすると上のサービスプロバイダが使用できるようになります。

以上

サービスプロバイダを使いこなせると色々な事が簡単に実装できたり

自分でサービスを作成することでそのアプリケーションに合ったサービスも作成できるようになるのでより良いサービスが作れるようになります。

4
4
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
4
4