Laravel:外观和别名的区别

Mar*_*jía 5 php laravel laravel-4 laravel-facade

再会!

我读得越多,我就越对此感到困惑。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

}
Run Code Online (Sandbox Code Playgroud)

以及相应的外观,因此我可以仅使用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',
),
Run Code Online (Sandbox Code Playgroud)

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

那么,有什么区别呢?

谢谢

编辑#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
}
Run Code Online (Sandbox Code Playgroud)

我有一个 Facade Class 这个类数据/app/libraries/Project/DataFacade.php

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

我有他们的服务提供者:/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;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我还添加到/app/config/app.php

'providers' => array(
    // ....
    'DataServiceProvider',
),
Run Code Online (Sandbox Code Playgroud)

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

"psr-4": {
     "PJ\\": "app/libraries/Project"
},
Run Code Online (Sandbox Code Playgroud)

通过这样做,我可以从项目中的任何地方访问我的类,只需通过 PJD:: 而不是 PJ\Data::。

但是,我也注意到只需添加到/app/config/app.php

'aliases' => array(
    //....,
    'PJD'             => 'PJ\Data',
),
Run Code Online (Sandbox Code Playgroud)

在没有所有外观和服务提供者的情况下,我得到了完全相同的结果。那么,一个或另一个的重点是什么?

谢谢,很抱歉这篇大帖子。

ita*_*chi 5

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

不能访问PJ\Data\PJD::,除非你有设置alias在服务提供商,同时结合。

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

别名的定义,

用于表示一个具名的人在另一个指定的名字下也是已知的或更熟悉的。

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

例如

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

笔记:

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