Laravel 4控制器中的依赖注入实例化了所有对象

时间:2014-05-27 07:52:37

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

我想在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对象已经实例化了,这真的不太好。

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

2 个答案:

答案 0 :(得分:5)

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

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

  • 懒惰注射。我不知道Laravel DI容器是否提供此功能,但想法是注入一个懒惰地加载服务的代理。如果未使用该服务,则不会加载该服务。
  • 单独的控制器。您可以将控制器分成两部分,以便只注入您真正使用的服务。有时,某些依赖项未被使用这一事实表明类/控制器执行的操作太多,因此拆分它无论如何都是件好事。

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

答案 1 :(得分:1)

Laravel 5将进行控制器方法注入。

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