Laravel - 使用$ app而不是Facades

 吕志心可和 发布于 2023-02-13 08:57

在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\ServiceProviderServiceProviders是启动服务的人,将在您的应用程序中使用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绑定并将其设置为$appvar ...

动机2

其他一些人可能会过度使用,以免轻易破坏他们的包裹.依靠别名来使您的包工作是危险的,因为如果用户更改该别名,则包可能会中断.这可能是一个用户问题,但它也会给他们带来一些问题,比如Github上的问题.

1 个回答
  • 动机1

    有些包需要.

    通常,您会看到ServiceProviders以这种方式使用它:

    $this->app['db']
    

    或者在闭包内部:

    $this->app->bindShared('anything', function($app)
    {
        return new DatabaseClass($app['db']->connection());
    });
    

    因为它$app是一个属性,Illuminate\Support\ServiceProviderServiceProviders是启动服务的人,将在您的应用程序中使用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绑定并将其设置为$appvar ...

    动机2

    其他一些人可能会过度使用,以免轻易破坏他们的包裹.依靠别名来使您的包工作是危险的,因为如果用户更改该别名,则包可能会中断.这可能是一个用户问题,但它也会给他们带来一些问题,比如Github上的问题.

    2023-02-13 09:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有