绑定到Laravel-IoC,而不是一次又一次地实例化



在我的应用程序中,我有一个名为"LogService"的服务来记录事件和其他项目。我基本上需要在每个控制器上使用它来记录用户的事件。我没有在每个控制器中实例化这个服务,而是有两个想法来实现这一点。

选项1:将服务绑定到IoC,然后以的方式解决它

选项2:制作一个包含服务的主类,然后将其扩展到其他类,以便它们与已经绑定的服务一起提供

我对以下每种方法都有疑问:

选项1:这可能吗?如果是这样的话,它会被调用吗?这种方式在IDE的中似乎不太好用

选项2:我过去也做过这种事情,但PHPStorm似乎无法识别父对象中的服务,因为它是由"App::make()"实例化的,而不是通过常规的依赖项注入。

最好的行动方案是什么?

谢谢!

你可以双管齐下,我认为最简洁的方法是:

1) 有一个描述类的接口,我们称之为LogServiceInterface

2) 创建一个实例化类的服务提供程序,如下所示:

<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
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
AppProvidersLoggerServiceProvider::class,
],

4) 现在,在控制器中,您可以直接在构造函数中请求实现LoggerServiceInterface的实例:

(某些控制器):

<?php namespace AppHttpControllers;
use IlluminateRoutingController;
use AppRepositoriesOrderRepository;
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.

相关内容

  • 没有找到相关文章

最新更新