サーチ…


前書き

Laravelは、サービスと呼ばれるさまざまなクラスへのアクセスを許可します。一部のサービスはすぐに利用できますが、あなた自身で作成することができます。

サービスは、コントローラのようなアプリケーションの複数のファイルで使用できます。サービスOurServiceが乱数を返すgetNumber()メソッドを実装しているとしましょう:

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        return app(OurService::class)->getNumber();
    }
}

サービスを作成するには、新しいクラスを作成する必要があります。

# app/Services/OurService/OurService.php

<?php
namespace App\Services\OurService;

class OurService 
{
    public function getNumber()
    {
        return rand();
    }
}

現時点では、すでにこのサービスをコントローラで使用できますが、必要になるたびに新しいオブジェクトをインスタンス化する必要があります。

class SomeController extends Controller {
    
    public function getRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }

    public function getOtherRandomNumber()
    {
        $service = new OurService();
        return $service->getNumber();
    }
}

そのため、 サービスコンテナにサービスを登録するのが次のステップです。サービスをサービスコンテナに登録すると、必要なときにいつでも新しいオブジェクトを作成する必要はありません。

サービスコンテナにサービスを登録するには、 サービスプロバイダを作成する必要があります 。このサービスプロバイダは、

  1. サービスを登録メソッドでサービスコンテナに登録する
  2. ブート方法を使用してサービス(依存関係)に他のサービスを注入します

サービスプロバイダは、抽象クラスIlluminate\Support\ServiceProvider拡張したクラスです。サービスをService Container登録するには、 register()メソッドを実装する必要があります。

# app/Services/OurService/OurServiceServiceProvider.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\ServiceProvider;

class OurServiceServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('OurService', function($app) {
            return new OurService();
        });
    }
}

すべてのサービスプロバイダconfig/app.php配列に保存されます。サービスプロバイダをこの配列に登録する必要があります:

return [

    ...

    'providers' => [

        ...

        App\Services\OurService\OurServiceServiceProvider::class,

        ...

    ],

    ...

];

これでコントローラでサービスにアクセスできるようになりました。 3つの可能性:

  1. 依存性注入:
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function __construct(OurService $our_service)
    {
        dd($our_service->getNumber());
    }
}
  1. app()ヘルパー経由のアクセス:
<?php
namespace App\Http\Controllers;

use App\Services\OurService\OurService;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return app('OurService')->getNumber();
    }
}

Laravelは、すべてのプロジェクトで使用でき、サービスを反映できるFacades、想像上のクラスを提供します。あなたのサービスにもっと簡単にアクセスするために、ファサードを作成することができます:

<?php
namespace App\Http\Controllers;

use Randomisator;

class SomeController extends Controller
{
    public function getRandomNumber()
    {
        return Randomisator::getNumber();
    }

}

新しいファサードを作成するには、 Illuminate\Support\Facades\Facade拡張する新しいクラスを作成する必要があります。このクラスは、 getFacadeAccessor()メソッドを実装し、 サービスプロバイダによって登録されたサービスの名前を返す必要があります

# app/Services/OurService/OurServiceFacade.php

<?php
namespace App\Services\OurService;

use Illuminate\Support\Facades\Facade;

class OurServiceFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'OurService';
    }
}

あなたはファサードをconfig/app.phpに登録する必要もあります:

return [

    ...

    'aliases' => [

        ....

        'Randomisator' => App\Services\OurService\OurServiceFacade::class,
    ],

];

Facadeはプロジェクトのどこにでもアクセスできます。

ビューからサービスにアクセスするには、ヘルパー関数を作成します。 Laravelには、 auth()関数やview()関数のような、いくつかのヘルパー関数が用意されています。ヘルパー関数を作成するには、新しいファイルを作成します。

# app/Services/OurService/helpers.php    

if (! function_exists('randomisator')) {
    /**
     * Get the available OurService instance.
     *
     * @return \App\ElMatella\FacebookLaravelSdk
     */
    function randomisator()
    {
        return app('OurService');
    }
}

このファイルを登録する必要がありますが、 composer.jsonファイルに登録する必要があります:

{

    ...

    "autoload": {
        "files": [
            "app/Services/OurService/helpers.php"
        ],

        ...
    }
}

このヘルパーをビューで使用できるようになりました。

<h1>Here is a random number: {{ randomisator()->getNumber() }}</h1>


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow