【问题标题】:Dependency Injection in Laravel 4 controllers instance all of the objectsLaravel 4 控制器中的依赖注入实例化所有对象
【发布时间】:2014-05-27 07:52:37
【问题描述】:

我想在 Laravel 4 控制器中制作可测试的代码。我知道 DI(依赖注入),我知道可测试的代码可能看起来像:

class UsersController extends BaseController
{
    public function __construct(User $user, Notice $notice) 
    {
        $this->user = $user;
        $this->notice = $notice;
    }

    public function getIndex()
    {
        ...
        $this->user
        ...
        $this->notice
        ...
    }

    public function getPage()
    {
        ...
        $this->user
        ...
    }
}

如您所见,我将两个对象注入到控制器中。

对于getIndex 函数,非常完美,我在其中使用了两个对象。

但请注意,对于getPage 函数,我只使用$this->user,不需要$this->notice

但是,$this->notice 对象已经被实例化了,这确实不好。

有没有更好的方法不实例化所有对象?

【问题讨论】:

    标签: php laravel dependency-injection controller laravel-4


    【解决方案1】:

    在大多数情况下,我认为这是过早的优化,因为开销可能微不足道,您只是在浪费时间。

    如果这是您的应用程序中的性能问题,那么您有以下解决方案:

    • 惰性注入。我不知道 Laravel DI 容器是否提供此功能,但想法是注入一个将延迟加载服务的代理。如果服务没有被使用,它就不会被加载。
    • 单独的控制器。您可以将控制器一分为二,以便只注入您真正使用的服务。有时,没有使用某些依赖项这一事实表明类/控制器做了太多事情,因此拆分它无论如何都是一件好事。

    但是您可能不应该关心创建一个您不使用的注入对象,因为您只会节省 0.00001 秒,而且没有人会看到差异。

    【讨论】:

    • 如果你在 laravel 中构建你的代码,那么是的,延迟加载是可能的。您只需要在 start global.php 中显式实例化运行时所需的文件,然后使用正常的命名空间调用加载其他文件。另外,为了测试,我建议将自定义类放在 composer.json 文件中,因为在全局中将它们实例化不会在测试运行时及时初始化它们
    【解决方案2】:

    Laravel 5 将有控制器方法注入。

    http://laravel.com/docs/master/releases#laravel-5.0

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多