1
サービスクラスを定義しましたFooService
;LaravelのサービスへのDI
<?php
namespace My\Services;
use My\Contracts\Services\FooServiceContract;
class FooService implements FooServiceContract
{
public function doSomething()
{
return 'fubar';
}
}
AppServiceProvider
に登録されているインターフェイスを拡張します。
<?php
namespace My\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
private $singletons = [
\My\Services\FooContract::class => \My\Services\FooService::class,
];
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
CollectionMacros::init();
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->registerLogger();
foreach ($this->singletons as $abstract => $concrete) {
$this->app->singleton($abstract, $concrete);
}
}
}
私はこれを他の場所(私のコントローラ)で使うことができるように私は特性を作りました。 特性
<?php
namespace My\Dependencies;
use My\Contracts\Services\FooServiceContract;
trait TheFooService
{
protected function getDashboardService()
{
return app(FooServiceContract::class);
}
}
コントローラの例;
<?php
namespace My\Http\Controllers\Billing;
use My\Http\Controllers\Controller;
use My\Dependencies\TheFooService;
class BarController extends Controller
{
use TheFooService;
public function hello()
{
$a = $this->TheFooService()->doSomething();
// ...
}
}
これはすべて正常に動作します。
しかし、別の定義されたクラスをサービスクラスに追加する方法はありますか?それで、クラスを使用することができますか?
私がこれを読んだところから、構造体にクラスをタイプヒントしたときに機能しますが、インターフェイスの型指定ができるようにしたいと考えています。
たとえば、私が最後にしたいのは、
<?php
namespace My\Services;
use My\Contracts\Services\FooServiceContract;
class FooService implements FooServiceContract
{
public function __construct(BobInterface $randonClass)
{
$this->name = $randomClass;
}
}