如何在课堂上访问Laravel Singletons?

Yah*_*din 5 php service-provider laravel laravel-5

我在服务提供商中注册了一个单身人士,如下所示:

$this->app->singleton(MyClass::class);
Run Code Online (Sandbox Code Playgroud)

通常只需在参数中声明它就可以访问它:

class FooController extends Controller
{
    public function index(MyClass $myClass)
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我似乎无法在其他自定义类(即非控制器类)中访问此单例.(https://laravel.com/docs/5.2/container#resolving)

比如像这里:

class Bar {
   private $myClass;
   private $a;
   private $b;

   public function __construct($a, $b) {
      $this->a = $a;
      $this->b = $b;
      $this->myClass = ... // TODO: get singleton
   }
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

请注意,我将创建多个实例Bar.

nCr*_*zed 8

在构造函数中键入提示类/接口,在大多数情况下,Laravel会自动解析并将其注入到您的类中.

有关示例和备选方案,请参阅服务提供商文档.

跟你的例子一起:

class Bar {
    private $myClass;

    public function __construct(MyClass $myClass) {
       $this->myClass = $myClass;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果Bar::__construct采用服务提供程序中无法定义的其他参数,则必须使用服务定位器:

/* $this->app is an instance of Illuminate\Foundation\Application */
$bar = new Bar($this->app->make(MyClass::class), /* other parameters */);
Run Code Online (Sandbox Code Playgroud)

或者,将服务位置自动移动到构造函数中:

use  Illuminate\Support\Facades\App;

class Bar {
    private $myClass;

    public function __construct() {
       $this->myClass = App::make(MyClass::class);
    }
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*hvh 7

在后来的 Laravel 版本 6 及更高版本中,有更多的帮助器来解决这个问题:

resolve(MyClass::class);
app(MyClass::class);
Run Code Online (Sandbox Code Playgroud)

&其他答案提供的所有方法

class Bar {
   private $myClass;
   private $a;
   private $b;

   public function __construct($a, $b) {
      $this->a = $a;
      $this->b = $b;
      $this->myClass = app(MyClass::class);
   }
}
Run Code Online (Sandbox Code Playgroud)