サーチ…
前書き
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();
}
}
そのため、 サービスコンテナにサービスを登録するのが次のステップです。サービスをサービスコンテナに登録すると、必要なときにいつでも新しいオブジェクトを作成する必要はありません。
サービスコンテナにサービスを登録するには、 サービスプロバイダを作成する必要があります 。このサービスプロバイダは、
- サービスを登録メソッドでサービスコンテナに登録する )
- ブート方法を使用してサービス(依存関係)に他のサービスを注入します
サービスプロバイダは、抽象クラス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つの可能性:
- 依存性注入:
<?php
namespace App\Http\Controllers;
use App\Services\OurService\OurService;
class SomeController extends Controller
{
public function __construct(OurService $our_service)
{
dd($our_service->getNumber());
}
}
-
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>