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

Php 绑定到Laravel IoC,而不是一次又一次地实例化,php,laravel-5,phpstorm-2018.1,Php,Laravel 5,Phpstorm 2018.1,在我的应用程序中,我有一个名为“LogService”的服务来记录事件和其他项目。我基本上需要在每个控制器上使用它来记录用户的事件。不必在每个控制器中实例化此服务,我有两个想法来实现这一点 选项1:将服务绑定到IoC中,然后以这种方式解决 选项2:创建一个包含服务的主类,然后为其他类扩展它,以便它们与已绑定的服务一起提供 我对每种方法都有疑问: 选项1:这可能吗?如果是这样,是否只需要使用“App::make()”就可以调用它?这种方式似乎不太适合IDE 选项2:我以前做过这种事情,但PHPSt

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

选项1:将服务绑定到IoC中,然后以这种方式解决

选项2:创建一个包含服务的主类,然后为其他类扩展它,以便它们与已绑定的服务一起提供

我对每种方法都有疑问:

选项1:这可能吗?如果是这样,是否只需要使用“App::make()”就可以调用它?这种方式似乎不太适合IDE

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

最好的做法是什么


谢谢

两种方式都可以,我认为最整洁的方式是:

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();
         });
     }
  }
4) 现在,在controller中,您可以直接在构造函数中请求实现
LoggerServiceInterface
的对象的实例:

(部分控制员):


我看这和我原来的问题没什么不同。我错过什么了吗?如果我遵循这种模式,我将不得不将日志服务接口引入每个控制器。我想知道是否有可能避免这样做。你仍然可以用app()->make()实现它,但我不认为PHPstorm会在你这样做的时候得到它,然后你就不会得到代码提示,这不是最大的问题,但会很好。哦,我现在更清楚地看到你的问题:)我更新了我的答案,我希望这会有所帮助@ackerchezah,我明白了。谢谢
'providers' => [
    // Other Service Providers

    App\Providers\LoggerServiceProvider::class,
],
<?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
    }

}
/**
 * @var LoggerServiceInterface $logger
 */
 $logger = app()->make(LoggerServiceInterface::class);

That way, Phpstorm will know what to expect from that $logger object.