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() 辅助函数的主要内容,如果未能解决你的问题,请参考以下文章