Właśnie zaczynamy podejmować skoordynowane wysiłki w celu równomiernego wykorzystania wtyczki zależności w naszym projekcie, a ja natknąłem się na problem.Wstrzyknięcie zależności od PHP, gdy argumenty konstruktora są niedostępne.
Piszę klasę do obsługi zapytań MongoDB. Przepuszczam MongoClient jako zależność od konstruktora, bez problemu. Ale jak radzić sobie z zależnością, gdy zmienna niezbędna do utworzenia obiektu nie jest dostępna w momencie tworzenia?
W szczególności mamy wrapper dla metody MongoCollection, findOne, że jeśli wpiszesz łańcuch, obecnie (w starym kodzie) zamienia go na MongoId z "nowym MongoId (identyfikator $ _)", i używa go do funkcji wyszukiwania.
Z tego, co dowiedziałem się o wstrzyknięciu zależności, posiadanie "nowego MongoId" jest złym pomysłem i już wiem, że utrudni to pisanie przypadków testowych dla funkcji, która konwertuje ciąg na MongoId.
Ale jak obsługiwać wstrzyknięcia, gdy klasa MongoId przyjmuje ciąg identyfikator na konstruktorze?
Jedyną rzeczą, myślałem o tym, że praca jest przekazać w zamknięciu w konstruktorze klasy, która robi coś takiego:
$getMongoId = function($id){
return new MongoId($id);
};
z
class MyMongo
{
function __construct(MongoClient $client, Closure $mongoIdGetter){...}
}
[edytowane, aby to naprawić ostatnia część]
Ale czy to jest właściwy sposób, aby sobie z tym poradzić? Oczywiście, jeśli używamy DiC, możemy to zrobić, ale wymaganie zamknięcia dla konstruktora wydaje się być trochę zbyt duże. Czy jestem po prostu zbyt dogmatyczny odnośnie wstrzykiwania moich zależności? Mógłbym to naprawić łatwo za pomocą "nowego MongoId ($ _ id)" w nowej klasie, jak przypuszczam.
Dzięki - konstrukcja $ __ była po prostu mózgowym pierdnięciem, naprawionym powyżej. Myślę, że częściowo błędnie przeczytałeś moje pytanie, ponieważ kiedy mówię "uchwyt" powyżej, nie mówię o obsłudze błędów, tylko o ogólnym znaczeniu tego słowa. – Karptonite
@Karptonite Oh ok, więc możesz wyjaśnić, dlaczego chcesz ustawić konstruktor MongoId w konstrukcie, rozumiem zależność, ale nie będzie to potrzebne, dopóki nie użyjesz funkcji 'find'. Chodzi mi o to, że do testowania jednostkowego wystarczy, że sprawdzisz odpowiedź funkcji publicznej, że zwraca dokument, który powinien istnieć podczas wprowadzania ciągu znaków dla '_id', nie powinieneś rozszerzać testów jednostkowych na sam sterownik MongoDB. – Sammaye
Jestem nowy w zastrzyku zależności - ale zrozumiałem, że używanie funkcji, jaką napisałeś, z "nowym MongoId" w samym kodzie, było generalnie złym pomysłem - na przykład, jeśli użyłem jakiejkolwiek metody MongoId w moim nie mogłem z niego kpić, aby mój kod poprawnie nazywał te metody. Oczywiście, nie jest to coś, co teraz robię. – Karptonite