Цель состоит в том, чтобы создать класс Reader , который является оберткой поверх Лиги Flysystem документация
Reader должен обеспечивать удобный способ чтения всех файлов в каталоге независимо от физической формы файла (локальный файл или файл в архиве)
Из-за метода DI оболочка не должна создавать экземпляры зависимостей внутри него, а должна принимать эти зависимости в качестве аргументов в конструкторе или другом методе установки.
Вот пример , как использовать League Flysystem самостоятельно (без упомянутой обертки)
читать обычный файл с диска:
<?php
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local;
$adapter = new Local(__DIR__.'/path/to/root');
$filesystem = new Filesystem($adapter);
$content = $filesystem->read('path-to-file.txt');
Как видите, вы сначала создаете адаптер Local , для которого требуется путь в его конструкторе.
затем вы создаете файловую систему , которая требует экземпляра адаптера в своем конструкторе.
аргументы для обоих: Файловая система и Локальные не являются обязательными. Они должны быть переданы при создании объектов из этих классов.
оба класса также не имеют открытых сеттеров для этих аргументов.
Мой вопрос заключается в том, как написать класс Reader, который оборачивает Filesytem и Local, используя затем Dependency Injection?
Обычно я делал бы что-то похожее на это:
<?php
use League\Flysystem\FilesystemInterface;
use League\Flysystem\AdapterInterface;
class Reader
{
private $filesystem;
private $adapter
public function __construct(FilesystemInterface $filesystem,
AdapterInterface $adapter)
{
$this->filesystem = $filesystem;
$this->adapter = $adapter;
}
public function readContents(string $pathToDirWithFiles)
{
/**
* uses $this->filesystem and $this->adapter
*
* finds all files in the dir tree
* reads all files
* and returns their content combined
*/
}
}
// and class Reader usage
$reader = new Reader(new Filesytem, new Local);
$pathToDir = 'someDir/';
$contentsOfAllFiles = $reader->readContents($pathToDir);
//somwhere later in the code using the same reader object
$contentsOfAllFiles = $reader->readContents($differentPathToDir);
Но это не будет работать, потому что мне нужно передать локальный адаптер в
Конструктор файловой системы и для этого мне нужно перейти к
Путь к локальному адаптеру, во-первых, полностью против целой точки
удобство чтения читателя, который просто проходит путь к каталогу
где все файлы и Reader делает все, что нужно сделать
обеспечить содержимое этих файлов одним методом readContents ().
Так что я застрял.
Можно ли использовать этот Reader как оболочку для Filestem и его локального адаптера?
Я хочу избежать тесной связи, когда я использую ключевое слово new и получаю объекты зависимостей таким образом :
<?php
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local;
class Reader
{
public function __construct()
{
}
public function readContents(string $pathToDirWithFiles)
{
$adapter = new Local($pathToDirWithFiles);
$filesystem = new Filesystem($adapter);
/**
* do all dir listing..., content reading
* and returning results.
*/
}
}
Вопросы:
Есть ли способ написать оболочку, которая использует файловую систему и локальные в качестве зависимостей в режиме внедрения зависимостей?
Существует ли какой-либо другой шаблон, кроме оболочки (адаптера), который помог бы создать класс Reader без тесной связи с файловой системой и локальной системой?
Забывает на некоторое время о классе Reader вообще: если Файловая система требует экземпляра Local в своем конструкторе, а Local требует строку (путь к dir) в своем конструкторе, то возможно ли использовать эти классы внутри контейнера внедрения зависимости ( Symfony или Pimple) в разумных пределах?
DIC не знает, какой путь arg проходит к локальному адаптеру, поскольку путь будет определен где-то позже в коде.