Я работаю над расширением Magento 2, которое требует чтения файлов из файловой системы.
При запуске сниффера php с использованием стандартов ECGM2 он жалуется на то, что я использую такие функции, как basename
или dirname
.
Использование функции dirname () запрещено
или
Использование функции basename () запрещено
Какую обертку я должен использовать вместо тех, чтобы получить тот же эффект?
[РЕДАКТИРОВАТЬ]
Вот код, но это не имеет отношения к вопросу.
У меня есть класс коллекции, который расширяет \Magento\Framework\Data\Collection\Filesystem
класс, и я хочу перечислить эту коллекцию в сетке (ui-компоненты), и одно из действий в сетке - действие загрузки.
Для этого мне нужно получить фактическое имя файла, чтобы я мог отправить его в действие загрузки.
// here $file is dynamic and it can be
// folder/filename.xml or folder/subfolder/file.tar.gz
//so there is no strict number of folders and subfolders.
$file = $downloader->getRelativePath($packageName);
$relativeFile = UmcFilesystem::VAR_DIR_NAME . '/' .$file;
$absoluteFile = $rootDir->getAbsolutePath($relativeFile);
if ($rootDir->isFile($relativeFile) && $rootDir->isReadable($relativeFile)){
//I don't want to use `explode` just for the sake of avoiding basename
$fileName = basename($absoluteFile);
$this->fileFactory->create(
$fileName,
null,
DirectoryList::VAR_DIR,
'application/octet-stream',
$rootDir->stat($relativeFile)['size']
);
$resultRaw = $this->resultRawFactory->create();
$resultRaw->setContents($rootDir->readFile($relativeFile));
return $resultRaw;
} else {
...
}
basename
. Пожалуйста, внимательно прочитайте вопрос.Ответы:
Мне тоже нужно было что-то подобное в последнее время. Единственное решение, которое я нашел, чтобы получить
basename
иdirname
использовал:До этого я пытался использовать
Magento\Framework\Filesystem\Directory\Write
иgetDriver()
безуспешно. С ними вы можете получить почти все, но неbasename
.источник
\Magento\Framework\Filesystem\Io\File
инъекции в моем собственном классе для другой функциональности. Я просто не знал заранее оgetPathInfo
методе.К счастью, git позволяет нам видеть, когда dirname и basename были запрещены , причина в том, что «Добавлены файлы»
Глядя на проблему для проекта ЭКГ, вы можете увидеть закрытые проблемы, такие как что-то плохое в file_exists? # 33 , Функции ошибок # 26 , что-то плохое в этих функциях? # 17 , Контекст / Объяснение для Правил # 12 , Использование функции iconv () запрещено # 14, что заставило бы меня думать, что первоначальный список запрещенных функций не получил слишком большого внимания, и magento, вероятно, поддаются изменению Запрещенный список.
Поиск по базе кода m2 показывает ~ = 78 результатов для базового имени, смеси переменных и кода, вызывающего базовое имя, включая мое любимое .
Я думаю, что если бы я был на вашем месте, я бы опубликовал вопрос на github и спросил бы zlik, думает ли он, что они принадлежат ему, или если M2 предоставляет оболочку
источник
Вы можете использовать объект
SplFileInfo()
класса, может быть, это будет работать.может быть, это будет работать.
Вы также можете сослаться на этот URL.
источник
Мое предложение будет использовать
Magento/Backup
модуль в качестве примера.Было бы интересно взглянуть на способ написания класса действий загрузки, поскольку он также имеет дело с реальными файлами для загрузки:
Для меня вы должны посмотреть, как этот метод генерирует файл для загрузки, используя
\Magento\Framework\App\Response\Http\FileFactory
иgenerateBackupDownloadName
изMagento\Backup\Helper\Data
(обратите внимание на рекомендуемое использование OM;))Еще один интересный бит
Еще одна интересная вещь, на которую стоит обратить внимание, это
getStorageData
методMagento\MediaStorage\Model\ResourceModel\File\Storage\File
которых сам по себе вызывает непосредственноdirname
и ,basename
но если вы вызвать этот метод ядра в модуле, вы не получите запрещенные ошибки;)В аналогичной идее есть также
collectFileInfo
отMagento\MediaStorage\Helper\File\Media
источник
generateBackupDownloadName
использует некоторые магические геттеры из резервной модели. Поэтому им нужно было вызвать магических сеттеров раньше. Я не вижу ничего связанного с базовым именем или альтернативой ему.collectFileInfo
отMagento\MediaStorage\Helper\File\Media
;)collectFileInfo
не поможет мне, потому что он ожидает файл в папке мультимедиа. Мой находится в папке var. Также неgetStorageData
имеет ничего общего с тем, что мне нужно. Я не хочу собирать все файлы в папку. У меня уже есть имя файла.