【问题标题】:Trouble Understanding Facade in Laravel无法理解 Laravel 中的外观
【发布时间】:2014-06-26 13:45:20
【问题描述】:

在大多数情况下,我了解外观背后的想法以及实例化对象的细节是如何隐藏在静态调用之后的。

因此,如果我们在这里看一下这个直截了当的示例:Example

我们看到一些类似这样的外观代码,此时它只是设置了某种别名。在这一点上,外观似乎仍然对Superuser 类一无所知。

class SuperuserFacade extends Facade
{
    protected static function getFacadeAccessor() { 
        return 'MyAlias'; 
    }
}

这里的逻辑似乎是由服务提供商粘合的:

class SuperuserServiceProvider extends ServiceProvider 
{
    public function register() {
        App::bind('MyAlias', function(){
            return new Superuser;
        });
    }
}

但它只是将类绑定到外观别名MyAlias。为什么要打扰那个外观类和两个单独的文件,我们不能在服务提供者中直接完成所有这些逻辑吗?或者在外观提供者中让它只返回Superuser 类?

看起来我们的外观并没有真正做任何事情,然后另一个文件告诉该外观要做什么。为什么将这些问题分开?

【问题讨论】:

    标签: php laravel laravel-4 facade


    【解决方案1】:

    外观类是一个简单的代理——它将对外观类的任何调用定向到根类,根类通过外观访问器(在本例中为MyAlias)从 IoC 容器中检索。

    1. 我打电话给Superuser::whoami()

    2. Superuser 外观显示“好的,我需要找到我作为代理的类。”

    3. facade 调用 getFacadeAccessor() 来确定要检索并随后调用的 IoC 绑定。

    4. Facade 向 IoC 容器请求 MyAlias 键。如果容器已经构建,则容器返回一个现有的类,或者运行它的绑定闭包,生成一个新的Superuser 实例。

    5. 1234563 /li>

    服务提供者的register() 方法只是简单地注册一个到IoC 容器的绑定,以便稍后被任何需要它的人检索。就是这样。 MyAlias 是一个简单的字符串键,用于查找该绑定。

    外观允许您像使用静态类一样使用 IoC 绑定类。

    我建议阅读有关该概念的其他文章,因为您链接的文章既不准确,也没有提供关于 为什么 工作有效的信息。 Here is a better article by Chris Fidao.

    【讨论】:

    • 我明白了连接它的逻辑,但为什么要分开它,为什么不让 Facade 返回 return new Superuser; 而不是让它返回别名 MyAlias
    • @Rob 因为外观只是一个代理或指针,指向现有项目。它不应该创建新对象,只需将调用定向到现有对象即可。
    猜你喜欢
    • 2019-01-11
    • 2013-12-17
    • 2015-10-26
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多