【发布时间】: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