Laravel中类门面的常量

6

我有一个名为Awesome的类,并使用ServiceProviderFacade将其注册到应用程序中。现在我可以使用Awesome::Things()来调用它。

我想向这个类添加常量,所以我尝试了以下代码:

<?php namespace Helper\Awesome;
class Awesome()
{
    public static $MOVIE = 'I love the Lego Movie!";
}

但是当我调用 Awesome::$MOVIE 时,我会得到 Access to undeclared static property: Helper\\Aesome\\Facades\\AwesomeFacade::$MOVIE 的错误提示。

有人可以帮忙吗?


不需要实例化该类,只需使用Helper\Awesome\Awesome::$MOVIE - Razor
1个回答

11
简而言之,你真的不想这样做。Laravel的Facade并不是用来像普通类一样使用的,如果你的应用程序以这种方式使用它们,很可能会让未来的开发人员感到困惑。
警告已经说完了。当你在Laravel中创建一个"facade"时,实际上你正在创建一个class alias。当你在app/config/app.php中的alias列表中添加了Awesome,在某个时刻类似下面的代码会运行:
class_alias('Helper\Aesome\Facades\AwesomeFacade','Awesome');

那意味着每当你使用一个全局非命名空间类Awesome时,PHP会替换为Helper\Aesome\Facades\AwesomeFacade。如果你想添加常量,你需要将它们添加到这个类中。
Laravel能够传递方法是因为基础Facade类实现了一个__callStatic方法,该方法将你的调用传递给实际的服务实现对象。但是,Facades不会传递静态常量访问。此外,PHP似乎没有类似的魔术方法来传递对常量的请求。
如果你对这个答案的详细版本感兴趣,我正在撰写关于Laravel对象系统的一系列文章,其中包括一些关于Facade实现的深入信息。

好的,谢谢回答。像 User 这样的类模型本身就是一个门面吗?还是我弄混了?我的想法是为我的一个模型(例如 User)创建一个帮助函数,比如 UserHelper,然后在其中执行所有应用逻辑。因此,例如,我会有 UserHelper::register(...)。这就是我到目前为止使用门面的方式。 - Kousha
@Kousha 我建议你先阅读我列出的文章系列,如果有问题再回来问。fasade 的作用只是提供了一种从 app()->make('someserver')->someMethod()SomeService::someMethod 的快捷方式。在 Laravel 中,第二种语法被称为 facade。虽然 Eloquent 模型也使用静态语法,但 eloquent 模型像 User 不是 fasade。 - Alana Storm
我正在阅读你的文章!非常感谢。只有一个小问题:如果我想编写一个帮助控制器逻辑的辅助函数,那应该叫什么?我如何使用静态语法的优雅方式来实现它? - Kousha
@Kousha Laravel对于你如何实现这个没有意见。如果是我,我会在某个地方定义一个\Namespaced\Helper\Class,定义静态方法(如果这是你想要使用的语法),然后在控制器文件的顶部执行use Namespaced\Helper\Class。这将允许您在控制器文件中使用Class::foo访问静态类方法。 - Alana Storm
1
我读了你的文章。我仍然不明白为什么我不能使用 Facades。我想为我的类创建静态方法,Facade 似乎是最好、最简单的方法。如果我不能使用它,那我该怎么办? - Kousha
@Kousha,你不是在创建一个方法,而是在创建一个静态常量。你不能用门面来做到这一点。把数据放在别的地方就好了。 - Alana Storm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接