Estoy trabajando en alguna extensión de Magento 2 que requiere leer archivos del sistema de archivos.
Al ejecutar el sniffer php usando los estándares ECGM2, se queja del hecho de que estoy usando funciones como basename
o dirname
.
El uso de la función dirname () está prohibido
o
El uso de la función basename () está prohibido
¿Qué envoltorio debo usar en lugar de aquellos para obtener el mismo efecto?
[EDITAR]
Aquí hay un código, pero no es tan relevante para la pregunta.
Tengo una clase de colección que extiende la \Magento\Framework\Data\Collection\Filesystem
clase y quiero enumerar esta colección en una cuadrícula (ui-components) y una de las acciones en la cuadrícula es una acción de descarga.
Para esto, necesito obtener el nombre real del archivo para poder enviarlo a la acción de descarga.
// 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 {
...
}
fuente
basename
allí. Por favor lea la pregunta cuidadosamente.Respuestas:
También necesitaba algo así recientemente. La única solución que encontré para obtener
basename
ydirname
estaba usando:Antes de eso intenté usar
Magento\Framework\Filesystem\Directory\Write
ygetDriver()
sin éxito. Con ellos puedes obtener casi todo, pero no elbasename
.fuente
\Magento\Framework\Filesystem\Io\File
inyectaron en mi propia clase para una funcionalidad diferente. Simplemente no sabía por adelantado sobre elgetPathInfo
método.Afortunadamente, git nos permite ver cuándo se prohibieron dirname y basename , la razón es claramente, "Archivos agregados"
Mirando el problema para el proyecto de ECG, ¿puede ver problemas cerrados como algo malo en file_exists? # 33 , Funciones de error # 26 , ¿ algo malo en estas funciones? # 17 , Contexto / Explicación de las Reglas # 12 , El uso de la función iconv () está prohibido # 14, lo que me haría pensar que la lista inicial de funciones prohibidas no se consideró demasiado, y que probablemente Magento sea susceptible de cambios La lista prohibida.
La búsqueda en la base de código m2 muestra ~ = 78 resultados para basename, una combinación de variables y el código que realmente llama a basename, incluido mi favorito .
Creo que si fuera usted, publicaría un problema en github y le preguntaría a zlik si todavía cree que pertenecen allí o si M2 proporciona un contenedor
fuente
Puede usar el objeto de
SplFileInfo()
clase si puede funcionar.Puede ser que funcione.
También puede consultar esta url.
fuente
Mi sugerencia sería utilizar el
Magento/Backup
módulo como ejemplo.Sería interesante observar la forma en que se escribe la clase de acción de descarga porque también trata con archivos reales para descargar:
Para mí, debe observar la forma en que este método genera el archivo para descargar usando
\Magento\Framework\App\Response\Http\FileFactory
ygenerateBackupDownloadName
desdeMagento\Backup\Helper\Data
(observe el uso recomendado del OM;))Otro poco interesante
Otra cosa interesante que debe observar es el
getStorageData
método desde elMagento\MediaStorage\Model\ResourceModel\File\Storage\File
cual se llama directamentedirname
y,basename
pero si llama a ese método central en su módulo, no obtendrá los errores prohibidos;)En una idea similar, también está el
collectFileInfo
deMagento\MediaStorage\Helper\File\Media
fuente
generateBackupDownloadName
utiliza algunos captadores de magia del modelo de respaldo. Por lo tanto, deben tener setters mágicos llamados antes. No veo nada relacionado con el nombre base o una alternativa a él.collectFileInfo
desdeMagento\MediaStorage\Helper\File\Media
;)collectFileInfo
no me ayudará porque espera un archivo dentro de la carpeta multimedia. El mío está en la carpeta var. TampocogetStorageData
tiene nada que ver con lo que necesito. No quiero recopilar todos los archivos en una carpeta. Ya tengo el nombre del archivo.