Например, мой DependentClass
зависит от некоторых AbstractCsv
учебный класс.
Вот декларация AbstractCsv
Фабрика (http://csv.thephpleague.com/instantiation/):
public static AbstractCsv::createFromFileObject(SplFileObject $obj): AbstractCsv
А вот и декларация DependentClass
конструктор:
class DependentClass {
public function __construct(AbstractCsv $csv) { /* implementation... */ }
// implementation...
}
Как вы можете видеть, чтобы создать экземпляр AbstractCsv
Мне нужно передать в случае SplFileObject
к заводской функции зависимости AbstractCsv::createFromFileObject
, Чтобы создать SplFileObject
Мне нужно имя файла. DependentClass
хранит необходимое имя файла (или, например, имя файла рассчитывается динамически в DependentClass
во время выполнения).
Как я могу передать экземпляр AbstractCsv
в DependentClass
конструктор, если:
DependentClass
сам, AbstractCsv
У меня сначала естьSplFileObject
а затем AbstactCsv
? ЭтоВ настоящее время я вижу единственное решение, чтобы разорвать этот круг: DependentClass
не должно зависеть от AbstractCsv
, но на его фабрике, которая обеспечит экземпляр AbstractCsv
в DependentClass
по запросу, по требованию. Это также избавит от необходимости создавать SplFileObject
в пределах DependentClass
:
class DependentClass {
public function __construct(CsvProvider $csvProvider) { /* implementation... */ }
// implementation...
public function someMethod($value) {
$filename = rand($value); // somehow calculate $filename
$csvFile = $this->csvProvider($filename);
$csvFile->fwrite($someData);
}
}
class CsvProvider {
public function get(string $filename) : AbstractCsv {
return AbstractCsv::createFromFileObject(new SplFileObject($filename));
}
}
Я думаю, что эта проблема распространена и встречается очень часто, верно? В настоящее время я новичок в DI, поэтому я задаюсь вопросом: действительно ли это решение является правильным способом решения этой проблемы? И как называются такие заводы? Я назвал это provider
, Это правильный термин для этого?
Задача ещё не решена.
Других решений пока нет …