Laravel 5:app() 辅助函数

Posted

技术标签:

【中文标题】Laravel 5:app() 辅助函数【英文标题】:Laravel 5: app() helper function 【发布时间】:2016-01-06 19:53:02 【问题描述】:

为什么有人要使用这个:

function flash($title)

    $flash = app('App\Http\Flash');

    return $flash->message('This is a flash message');

在此:

use App\Http\Flash;

function flash($title)

    $flash = new Flash;

    return $flash->message('This is a flash message');

在第一种情况下,我们获得了可用的容器实例。

在第二种情况下,我们加载 Flash 类并在我们的 flash 方法中实例化它。

我看到有人使用第一种方法,我想知道使用第二种方法是否有任何区别。

【问题讨论】:

【参考方案1】:

如果您在示例中使用它 - 您将不会获得任何利润。但是 Laravel 容器在这种解析方面提供了更多的功能,这是您通过简单的实例化对象无法实现的。

    绑定接口 - 您可以将特定接口及其实现绑定到容器中,并将其解析为接口。这对于测试友好的代码和灵活性很有用——因为您可以在一个地方轻松更改实现而无需更改接口。 (例如,在任何地方使用一些 Countable 接口作为从容器解析的目标,但接收它的实现。) 依赖注入 - 如果您将绑定类/接口并在某些方法/构造函数中将其作为依赖项询问 - Laravel 会自动为您从容器中插入它。 条件绑定 - 您可以绑定接口,但根据情况解决不同的实现。 单例 - 您可以绑定对象的一些共享实例。 解析事件 - 每次容器解析时 - 它都会引发一个事件,您可以在项目的其他位置订阅。

还有很多其他的练习... 你可以在这里阅读更详细的内容http://laravel.com/docs/5.1/container

【讨论】:

那么,如果可以选择,您会建议始终使用第一个选项而不是第二个选项吗?据我了解,它们都是 Laravel 容器,不是吗? 不——我建议您仅在需要权限时才使用 Laravel 容器。因为在您的示例中一切都是正确的 - 如果您只需要新的 Flash 实例 - 不需要使用容器。容器是工具而不是规则。 也许这可以完成@Silwerclaw的想法https://laravel.com/docs/8.x/container#when-to-use-the-container

以上是关于Laravel 5:app() 辅助函数的主要内容,如果未能解决你的问题,请参考以下文章

辅助函数未加载 laravel 5 - 调用未定义函数

laravel 5.5 《电商实战 》辅助函数

Laravel 添加自定义辅助函数

Laravel 5.4 和 WordPress 4.7 的辅助函数 __() 冲突

Laravel 辅助函数 base_path() 失败

我应该在 Laravel 5.7 中更好地使用 session() 或 collect() 辅助函数吗?