當使用依賴注入時,是否應該將依賴關係分別傳遞給構造函數,還是可以通過整個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