Рекомендуется создать интерфейс для FileManager и установить этот FileManagerInterface в качестве внедрения зависимости (вместо FileManager). Затем у вас могут быть разные классы, которые следуют одним и тем же правилам интерфейса, но просто имеют другой конструктор.
При таком подходе вы можете реализовать что-то вроде:
Service / FileManager. php
interface FileManagerInterface
{
// declare the methods that must be implemented
public function FileManagerFunctionA();
public function FileManagerFunctionB(ParamType $paramX):ReturnType;
}
FileManagerInterface. php
class FileManagerBase implements FileManagerInterface
{
// implement the methods defined on the interface
public function FileManagerFunctionA()
{
//... code
}
public function FileManagerFunctionB(ParamType $paramX):ReturnType
{
//... code
}
}
FileManagerForFactory. php
class FileManagerForFactory implements FileManagerInterface
{
// implement the specific constructor for this implementation
public function __construct(AccountFactory $account)
{
// your code here using the account factory object
}
// additional code that is needed for this implementation and that is not on the base class
}
FileManagerAnother. php
class FileManagerForFactory implements FileManagerInterface
{
// implement the specific constructor for this implementation
public function __construct(AccountInterface $account)
{
// your code here using the account object
}
// additional code that is needed for this implementation and that is not on the base class
}
Ответ И последнее, но не менее важное:
Controller / FileController. php
public function new(Request $request, FileManagerInterface $fileManager): Response
{
// ... code using the file manager interface
}
Другой подход, который также выглядит правильно, предполагает, что FileManager
зависит от AccountInstance
для работы, изменения можно сделать так, чтобы ваша FileManager
зависимость имела AccountInstance
в качестве зависимости вместо Factory
. Просто потому, что на самом деле FileManager
не нуждается в фабрике, ему нужен результат, который генерирует фабрика, поэтому, автоматически, FileManager не несет ответственности за всю фабрику.
При таком подходе вы будете только необходимо изменить ваши объявления, такие как:
Service / FileManager. php
public function __construct(AccountInterface $account)
{
$this->account = $account;
}
Service / AccountFactory. php
public function createAccount():AccountInterface
{
// ... your code
}