在Github上查看一些源代码时,我注意到一些软件包使用app容器本身来访问IOC,而不是Facades.你为什么要用这样的东西......
$app = app(); $user = $app['db']->connection()->table('users')->where('name', '=', 'Foo')->first();
......而不是这个?
$user = User::where('name', '=', 'Foo')->first();
Antonio Carl.. 5
动机1
有些包需要.
通常,您会看到ServiceProviders以这种方式使用它:
$this->app['db']
或者在闭包内部:
$this->app->bindShared('anything', function($app) { return new DatabaseClass($app['db']->connection()); });
因为它$app
是一个属性,Illuminate\Support\ServiceProvider
ServiceProviders是启动服务的人,将在您的应用程序中使用Facades.
因此,首先Laravel将实例化并启动所有提供IoC绑定服务的ServiceProviders,例如:
$this->app->bindShared('db', function($app) { return new DatabaseManager($app, $app['db.factory']); });
在特定电话之后,您可以访问Facade:
DB::table(...);
在此之前,你得到的是一个错误,告诉你没有'db'绑定.
我必须强调,你将主要看到在ServiceProviders上使用这种方式,因为闭包提供$app
变量以这种方式使用它:
$app['db']->connection()...
当然,任何人都可以获得app的IoC绑定并将其设置为$app
var ...
动机2
其他一些人可能会过度使用,以免轻易破坏他们的包裹.依靠别名来使您的包工作是危险的,因为如果用户更改该别名,则包可能会中断.这可能是一个用户问题,但它也会给他们带来一些问题,比如Github上的问题.
动机1
有些包需要.
通常,您会看到ServiceProviders以这种方式使用它:
$this->app['db']
或者在闭包内部:
$this->app->bindShared('anything', function($app) { return new DatabaseClass($app['db']->connection()); });
因为它$app
是一个属性,Illuminate\Support\ServiceProvider
ServiceProviders是启动服务的人,将在您的应用程序中使用Facades.
因此,首先Laravel将实例化并启动所有提供IoC绑定服务的ServiceProviders,例如:
$this->app->bindShared('db', function($app) { return new DatabaseManager($app, $app['db.factory']); });
在特定电话之后,您可以访问Facade:
DB::table(...);
在此之前,你得到的是一个错误,告诉你没有'db'绑定.
我必须强调,你将主要看到在ServiceProviders上使用这种方式,因为闭包提供$app
变量以这种方式使用它:
$app['db']->connection()...
当然,任何人都可以获得app的IoC绑定并将其设置为$app
var ...
动机2
其他一些人可能会过度使用,以免轻易破坏他们的包裹.依靠别名来使您的包工作是危险的,因为如果用户更改该别名,则包可能会中断.这可能是一个用户问题,但它也会给他们带来一些问题,比如Github上的问题.