在我的控制器中注入大量依赖项

时间:2014-08-04 11:50:57

标签: php dependency-injection controller dependencies

目前我只注入了我的RequestSessionUserService类,其余的我只是在我的代码中实例化,无论我需要它们。

现在,我已经学会了总是利用依赖注入将我的类与它的依赖关系松散地结合起来。在这种情况下,我真的需要注入所有这10个类并在我的构造函数参数中指定它们吗?

注册控制器(简化):

namespace Controllers;

use \vHttp\Request;
use \vHttp\Session;
use \Models\Services\User;
use \Libraries\Validator\Validator;
use \Libraries\Validator\Rules\MaxChars;
use \Libraries\Validator\Rules\Alpha;
use \Libraries\Validator\Rules\Email;
use \Libraries\Validator\Rules\Match;
use \Libraries\Validator\Rules\MinChars;
use \Libraries\CryptoCharGen;

class SignUp extends Controller
{
    private $session;

    public function __construct(Request $request, Session $session, UserService $userService)
    {
        parent::__construct($request, $userService);

        $this->session = $session;
    }

    public function index() {
        ...
    }

    public function submit() {
        ...
    }
}

2 个答案:

答案 0 :(得分:0)

如果我理解你的要求,简而言之。您必须仅为您的类传递您所需的参数的构造函数。在这种情况下,我认为可以使用验证器而不将它们传递给构造函数:

use \Libraries\Validator\Rules\Email;

class Signup extends Controller
{
    private $emailValidator;

    public function __construct(Request $request, Session $session, UserService $userService)
    {
        parent::__construct($request, $userService);

        $this->session = $session;
        $this->emailValidator = new Email();
    }
}

答案 1 :(得分:0)

默认情况下,您不必为所有内容注入依赖项。考虑将来可能需要更改哪些功能或使用测试进行模拟,并注入该功能。

如果您发现自己将多个依赖项传递给构造函数,请考虑是否有一个具有太多职责的类。考虑是否可以将依赖项封装到参数对象中,或者找到另一种方法来减少long parameter list

在使用依赖注入或任何其他设计模式时,您必须决定要进行哪些权衡。一方面,它可以使您的设计更灵活,松散耦合。另一方面,您真的需要额外的灵活性吗?通过使用没有真正需要的设计模式,您可能会浪费精力。