Laravel 5:app()辅助函数

Lov*_*ess 5 html php laravel

为什么有人会用这个:

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

    return $flash->message('This is a flash message');
}
Run Code Online (Sandbox Code Playgroud)

对此:

use App\Http\Flash;

function flash($title)
{
    $flash = new Flash;

    return $flash->message('This is a flash message');
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们获取可用的容器实例.

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

我见过有人使用第一种方法,我想知道使用第二种方法是否有任何区别.

Sil*_*law 10

如果你在你的例子中使用它 - 你将没有利润.但是Laravel容器在这种解析中提供了更多的功能,而使用简单的实例化对象无法实现.

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

还有许多其他实践......你可以在这里阅读更详细的http://laravel.com/docs/5.1/container

  • 那么,如果可以选择,您会建议始终使用第一个选择而不是第二个吗?在我看来,它们都是 Laravel 容器,不是吗? (2认同)
  • 不,我建议您仅在需要特权时才使用Laravel容器。因为在您的示例中,所有内容都是正确的-如果您只需要新的Flash实例-不需要使用容器。容器是一种工具,但不是规则。 (2认同)