如何在 class 中访问 Laravel 单例?
How to access Laravel Singletons in a class?
我已经在这样的服务提供商中注册了一个单例:
$this->app->singleton(MyClass::class);
这通常可以通过简单地在参数中声明来访问,如下所示:
class FooController extends Controller
{
public function index(MyClass $myClass)
{
//...
}
}
但是我似乎无法在其他自定义 类(即非控制器 类)中访问此单例。 (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
}
}
我该怎么做?
请注意,我将创建 Bar
的多个实例。
在您的构造函数中键入提示 class/interface,在大多数情况下 Laravel 将自动解析并将其注入您 class。
请参阅 Service Provider documentation 了解一些示例和备选方案。
以你的例子为例:
class Bar {
private $myClass;
public function __construct(MyClass $myClass) {
$this->myClass = $myClass;
}
}
如果 Bar::__construct
采用无法在服务提供商中预先定义的其他参数,您将不得不使用服务定位器:
/* $this->app is an instance of Illuminate\Foundation\Application */
$bar = new Bar($this->app->make(MyClass::class), /* other parameters */);
或者,将服务位置移动到它自己的构造函数中:
use Illuminate\Support\Facades\App;
class Bar {
private $myClass;
public function __construct() {
$this->myClass = App::make(MyClass::class);
}
}
您可以这样使用单例 运行 make
Application 方法:
use Illuminate\Contracts\Foundation\Application;
class Bar {
private $myClass;
private $a;
private $b;
public function __construct($a, $b, Application $app) {
$this->a = $a;
$this->b = $b;
$this->myClass = $app->make(MyClass::class);
}
}
您可以在 Container resolving documentation 中阅读更多相关信息。
在后来的 Laravel 版本 6 和更高版本中,有更多的助手可以解决这个问题:
resolve(MyClass::class);
app(MyClass::class);
&其他答案提供的所有方法
class Bar {
private $myClass;
private $a;
private $b;
public function __construct($a, $b) {
$this->a = $a;
$this->b = $b;
$this->myClass = app(MyClass::class);
}
}
我已经在这样的服务提供商中注册了一个单例:
$this->app->singleton(MyClass::class);
这通常可以通过简单地在参数中声明来访问,如下所示:
class FooController extends Controller
{
public function index(MyClass $myClass)
{
//...
}
}
但是我似乎无法在其他自定义 类(即非控制器 类)中访问此单例。 (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
}
}
我该怎么做?
请注意,我将创建 Bar
的多个实例。
在您的构造函数中键入提示 class/interface,在大多数情况下 Laravel 将自动解析并将其注入您 class。
请参阅 Service Provider documentation 了解一些示例和备选方案。
以你的例子为例:
class Bar {
private $myClass;
public function __construct(MyClass $myClass) {
$this->myClass = $myClass;
}
}
如果 Bar::__construct
采用无法在服务提供商中预先定义的其他参数,您将不得不使用服务定位器:
/* $this->app is an instance of Illuminate\Foundation\Application */
$bar = new Bar($this->app->make(MyClass::class), /* other parameters */);
或者,将服务位置移动到它自己的构造函数中:
use Illuminate\Support\Facades\App;
class Bar {
private $myClass;
public function __construct() {
$this->myClass = App::make(MyClass::class);
}
}
您可以这样使用单例 运行 make
Application 方法:
use Illuminate\Contracts\Foundation\Application;
class Bar {
private $myClass;
private $a;
private $b;
public function __construct($a, $b, Application $app) {
$this->a = $a;
$this->b = $b;
$this->myClass = $app->make(MyClass::class);
}
}
您可以在 Container resolving documentation 中阅读更多相关信息。
在后来的 Laravel 版本 6 和更高版本中,有更多的助手可以解决这个问题:
resolve(MyClass::class);
app(MyClass::class);
&其他答案提供的所有方法
class Bar {
private $myClass;
private $a;
private $b;
public function __construct($a, $b) {
$this->a = $a;
$this->b = $b;
$this->myClass = app(MyClass::class);
}
}