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

时间:2014-11-12 02:26:30

标签: 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

}

和相应的外观,所以我只能使用 PJD :: 进行访问。

根据一些网页:

  

... Laravel Facades是代理商。它们环绕并调用函数   关于代码的底层真实实现。而且,在   在Laravel应用程序的上下文中,可以访问这些Facade   将它们分配给别名。这种使用依赖注入   容器允许你引用类似的东西   只需调用File即可点亮\ 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
}

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

然而 ,我还注意到只需添加 /app/config/app.php

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

如果没有所有外观和ServiceProviders,我会得到完全相同的结果。那么,一个或另一个的重点是什么?

谢谢,抱歉这个大帖子。

1 个答案:

答案 0 :(得分:4)

Facade Alias 是两个完全不同的概念。

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

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

别名的定义,

  

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

这只是意味着你给了一个不同的名字,以便更容易打电话。

e.g。

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

注意:

  

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