首页 文章

Laravel:外墙和别名之间的区别

提问于
浏览
4

美好的一天!

我读的越多,我对此就越感到困惑 . 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 . 使用Dependency Injection容器允许您通过简单地调用File来引用Illuminate \ Support \ Facades \ Filesystem之类的东西 . (http://ryantablada.com/post/proxies-service-locators-alias-facades-and-war)

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

app/config/app.php

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

我也可以用同样的方式访问我的 class .

那么,有什么区别?

谢谢

EDIT #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
}

我有这个类数据的Facade类 /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 ::从项目的任何地方访问我的类 .

However ,我也注意到只是加入 /app/config/app.php

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

没有所有外观和ServiceProviders,我得到完全相同的结果 . 那么,一个或那个有什么意义呢?

谢谢,抱歉这篇大帖子 .

1 回答

  • 4

    FacadeAlias 是两个完全不同的概念 .

    除非您在绑定时在服务提供商中设置了 alias ,否则 PJ\Data\ 将被 PJD:: 访问 .

    如果您正在访问它,而不在config / app.php中定义它,那么您已在服务提供程序文件本身中进行了设置 .

    别名的定义,

    用于表示指定人员在另一个指定名称下也是已知或更熟悉的 .

    它只是意味着您为类提供了不同的名称,以便更容易调用 .

    例如

    如果您有这样的类: Foo\Bar\AVeryLongNamespaceClassName\Data ,您可以只提供别名(例如PJD)并通过此别名访问其方法和属性 .

    Note:

    单元测试是外墙以他们的方式工作的一个重要方面 . 事实上,可测试性是外墙甚至存在的主要原因 .

相关问题