【问题标题】:Laravel: Difference between Facades and AliasesLaravel:外观和别名之间的区别
【发布时间】:2015-01-08 18:55:25
【问题描述】:

美好的一天!

我读得越多,我就越困惑。 Facade 和 Aliases 有什么区别?

我有这个课程:

/app/libraries/Project/Data.php

namespace PJ;

class Data {

    // It is much like a data container, with static methods and properties for saving info

}

还有相应的门面,所以我可以使用 PJD:: 访问。

根据周围的一些网页:

... Laravel Facades 是代理。它们环绕并调用函数 关于代码的底层真实实现。此外,在 在 Laravel 应用程序的上下文中,这些 Facade 可以通过以下方式访问 将它们分配给别名。依赖注入的这种使用 容器允许你引用类似的东西 Illuminate\Support\Facades\Filesystem 只需调用 File. (http://ryantablada.com/post/proxies-service-locators-alias-facades-and-war)

但是,我还发现并成功测试了添加如下内容:

__app/config/app.php__

'aliases' => array(
    //....,
    'PJD'             => 'PJ\Data',
),

我也可以用同样的方式访问我的班级。

那么,有什么区别呢?

谢谢

编辑 #01

我在 /app/libraries/Project/Data.php

中创建了一个名为 Data 的类
namespace PJ;

class Data {
    // It is much like a data container, with static methods and properties for saving info
}

我有这个类数据的外观类/app/libraries/Project/DataFacade.php

use Illuminate\Support\Facades\Facade;   
class PJD extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJData';
    } 
}

我有他们的服务提供商:/app/libraries/Project/DataServiceProvider.php

use Illuminate\Support\ServiceProvider;

class DataServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJData', function() {
            return new PJ\Data;
        });
    }
}

我也已经添加到/app/config/app.php

'providers' => array(
    // ....
    'DataServiceProvider',
),

composer.json 中,我添加了一个 psr-4 行来将 PJ 命名空间定向到 /app/libraries/Project

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

通过执行所有这些操作,我可以从项目中的任何位置访问我的课程,只需通过 PJD:: 而不是 PJ\Data::。

不过,我也注意到,只需添加到 /app/config/app.php

'aliases' => array(
    //....,
    'PJD'             => 'PJ\Data',
),

没有所有的门面和服务提供者,我得到完全相同的结果。那么,一个或另一个的意义何在?

谢谢,很抱歉这篇大文章。

【问题讨论】:

  • 没有外观和服务提供者,您如何访问PJD 类及其方法和属性?你能编辑并举个例子吗?
  • 我在命名空间 PJ 下有这个类 Data。所以我访问 PJ\Data::。在 /app/config 中为 app.php 添加别名(通过将该行添加到别名数组中)我可以将 PJ\Data:: 作为 PJD:: 访问。所有这些都无需创建 Facades 和 ServiceProviders。在 composer.json 中,我将该 psr-4 部分以及“app/libraries”目录添加到自动加载类映射部分。
  • 不实例化类?...我的意思是对象?
  • 我应该吗?只要按照我说的去做就可以了。我刚刚在命名空间 PJ\ 下创建了另一个名为 Test 的类,只有一个属性 public static $testvar = 'Hi';。我在 app.php 'TestClass' => 'PJ\Test' 中添加了别名数组。就这样。我可以从任何地方访问TestClass::$testvar。我错过了什么吗?`
  • 检查我的回答中的 NOTE 以了解为什么需要外观。门面主要用于非静态方法。不是静态的。

标签: php laravel laravel-4 laravel-facade


【解决方案1】:

外观别名是两个完全不同的概念。

不能通过PJD:: 访问PJ\Data\,除非您在绑定时在服务提供者中设置了alias

如果您正在访问它,而没有在config/app.php 中定义它,那么您已经在服务提供者文件本身中设置了它。

别名的定义,

用于表示一个具名的人也以另一个指定的名字为人所知或更熟悉。

这只是意味着您为该类指定了一个不同的名称,以便更容易调用。

例如

如果你有这样的类:Foo\Bar\AVeryLongNamespaceClassName\Data,你可以只给一个别名,(例如PJD)并通过这个别名访问它的方法和属性。

注意:

单元测试是外观以它们的方式工作的一个重要方面。事实上,可测试性是外观存在的主要原因。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2015-01-13
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多