当使用依赖注入时,是否应该将依赖关系分别传递给构造函数,还是可以通过整个DI容器?依赖注入 - 注入容器还是个人依赖?
例如...我有一个名为'UserRepository'的存储库。它包含以下方法:
<?php
namespace MyApp\Repositories;
use \MyApp\Models\User;
class UserRepository {
private $ci;
public function __construct($ci)
{
$this->ci = $ci;
}
public function hashPassword($password)
{
return password_hash($password, PASSWORD_BCRYPT, [
'cost' => 15
]);
}
public function create($firstname, $lastname, $email, $password)
{
$user = User::create([
'firstname' => $firstname,
'lastname' => $lastname,
'email' => $email,
'password' => $this->hashPassword($password)
]);
return $user;
}
public function activateUser($userID)
{
$user = User($userID);
$user->email_verified = 1;
$user->save();
$verification = $user->verification();
$verification->is_used = 1;
$verification->validated_at = $this->ci->get('Carbon')::now();
$verification->save();
}
}
的Carbon
扶养可用,因为我已经在Pimple
容器通过。我可以通过这种方式访问任何依赖项(只要它们已注册)。
我使用的是Slim3
,它促进了这种类型的DI。但是,在像Laravel
这样的应用程序中,我看到依赖关系被单独传递给构造函数。
有什么建议吗?
当您将整个DI容器作为依赖关系传递时,您称之为“服务定位器”,并且是的,这是一种不好的做法。 – Federkun
@Federkun谢谢,这是有道理的。我相信疙瘩是一个服务定位器,所以现在我坚持这一点。我不知道两者是不同的。看来我并不是唯一一个感到困惑的人:https://www.reddit.com/r/PHP/comments/3x9e48/service_locator_dependency_injection/ – BugHunterUK
不,Pimple不是服务定位器,但是_you可以将它用作Service Locator_ – Federkun