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

Cyn*_*ial 3 php dependency-injection controller laravel 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
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

对于getIndex功能,它是完美的,我在其中使用两个对象.

但请注意,对于getPage功能,我只是使用$this->user,我不需要$this->notice.

但是,$this->notice对象已经实例化了,这真的不太好.

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

Mat*_*oli 5

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

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

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

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