Вы можете сделать это обоими способами, я думаю, что самый подходящий способ будет:
1) Есть интерфейс, который описывает ваш класс, назовем его LogServiceInterface
2) СоздатьПоставщик услуг, который создает экземпляр вашего класса, например:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class LoggerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
$this->app->bind(LogServiceInterface::class, function($app)
{
return new LogService();
});
}
}
3) Зарегистрируйте этого поставщика услуг в config/app.ph
файле:
'providers' => [
// Other Service Providers
App\Providers\LoggerServiceProvider::class,
],
4) Теперь в контроллере вы можете запроситьэкземпляр чего-то, что прямо в конструкторе реализует LoggerServiceInterface
:
(Некоторый контроллер):
<?php namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
use App\Repositories\OrderRepository;
class OrdersController extends Controller {
/**
* The logger service.
* @var LoggerServiceInterface $loggerService
*/
protected $loggerService;
/**
* Create a controller instance.
*
* @param OrderRepository $orders
* @return void
*/
public function __construct(LoggerServiceInterface $loggerService)
{
$this->loggerService = $loggerService;
}
/**
* Show all of the orders.
*
* @return Response
*/
public function index()
{
// $this->loggerService will be an instance of your LoggerService class that
// is instantiated in your service provider
}
}
Таким образом, у вас есть простой способ быстро изменить реализацию вашего сервисаБолее того, Phpstorm справится с этим очень легко.
Вы по-прежнему сможете использовать app()->make()
для получения экземпляра своего сервиса.Это, однако, не будет автоматически подхвачено Phpstorm.Но вы можете помочь ему понять, что все, что вам нужно сделать, это использовать аннотацию @var
, см.
/**
* @var LoggerServiceInterface $logger
*/
$logger = app()->make(LoggerServiceInterface::class);
That way, Phpstorm will know what to expect from that $logger object.