5

再会!

我读得越多,我就越困惑。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 是通过将它们分配给别名来访问的。依赖注入容器的这种使用允许您通过简单地调用 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',
),

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

那么,有什么区别呢?

谢谢

编辑#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',
),

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

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

4

1 回答 1

5

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

除非您在绑定时在服务提供商中进行了设置,否则您无法访问。PJ\Data\PJD::alias

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

别名的定义,

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

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

例如

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

笔记:

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

于 2014-11-12T02:35:34.963 回答