Je travaille sur une extension Magento 2 qui nécessite la lecture de fichiers à partir du système de fichiers.
Lorsque vous exécutez le renifleur php en utilisant les normes ECGM2, il se plaint du fait que j'utilise des fonctions comme basename
ou dirname
.
L'utilisation de la fonction dirname () est interdite
ou
L'utilisation de la fonction basename () est interdite
Quel emballage devrais-je utiliser à la place de ceux pour obtenir le même effet?
[EDIT]
Voici du code, mais ce n'est pas très pertinent pour la question.
J'ai une classe de collection qui étend la \Magento\Framework\Data\Collection\Filesystem
classe et je veux lister cette collection dans une grille (ui-components) et l'une des actions dans la grille est une action de téléchargement.
Pour cela, je dois obtenir le nom réel du fichier afin de pouvoir l'envoyer à l'action de téléchargement.
// 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
là-dedans. Veuillez lire attentivement la question.Réponses:
J'ai aussi eu besoin de quelque chose comme ça récemment. La seule solution que j'ai trouvé pour obtenir
basename
etdirname
utilisais:Avant cela, j'ai essayé d'utiliser
Magento\Framework\Filesystem\Directory\Write
etgetDriver()
sans succès. Avec eux, vous pouvez obtenir à peu près tout, mais pas lebasename
.la source
\Magento\Framework\Filesystem\Io\File
injecté dans ma propre classe pour une fonctionnalité différente. Je ne savais tout simplement pas d'avance sur lagetPathInfo
méthode.Heureusement, git nous permet de voir quand dirname et basename étaient interdits , la raison en est clairement: "Fichiers ajoutés"
En regardant le problème du projet ECG, vous pouvez voir des problèmes fermés tels que quelque chose de mauvais dans file_exists? # 33 , Fonctions d'erreur # 26 , quelque chose de mal dans ces fonctions? # 17 , Contexte / Explication des règles # 12 , L'utilisation de la fonction iconv () est interdite # 14 ce qui me ferait penser que la liste initiale des fonctions interdites n'a pas été trop considérée, et magento est probablement susceptible de changer la liste des interdits.
La recherche dans la base de code m2 affiche ~ = 78 résultats pour le nom de base, un mélange de variables et le code appelant réellement le nom de base, y compris mon préféré .
Je pense que si j'étais vous, je posterais un problème sur github et demanderais à zlik s'il pense toujours qu'ils appartiennent à cet endroit ou si M2 fournit un wrapper
la source
Vous pouvez utiliser un objet de
SplFileInfo()
classe peut-être que cela fonctionnera.peut-être que cela fonctionnera.
vous pouvez également renvoyer cette URL.
la source
Ma suggestion serait d'utiliser le
Magento/Backup
module comme exemple.La façon dont la classe d'actions de téléchargement est écrite serait intéressante à regarder car elle traite également des vrais fichiers à télécharger:
Pour moi, vous devriez regarder la façon dont cette méthode génère le fichier à télécharger en utilisant
\Magento\Framework\App\Response\Http\FileFactory
et àgenerateBackupDownloadName
partir deMagento\Backup\Helper\Data
(notez l'utilisation recommandée de l'OM;))Un autre morceau intéressant
Une autre chose intéressante que vous devriez regarder est la
getStorageData
méthode à partir deMagento\MediaStorage\Model\ResourceModel\File\Storage\File
laquelle elle-même appelle directementdirname
etbasename
mais si vous appelez cette méthode principale dans votre module, vous n'obtiendrez pas les erreurs interdites;)Dans une idée similaire, il y a aussi le
collectFileInfo
deMagento\MediaStorage\Helper\File\Media
la source
generateBackupDownloadName
utilise des getters magiques du modèle de sauvegarde. Ils doivent donc faire appeler des arrangeurs magiques avant. Je ne vois rien lié au nom de base ou une alternative à celui-ci.collectFileInfo
partir deMagento\MediaStorage\Helper\File\Media
;)collectFileInfo
ne m'aidera pas car il attend un fichier dans le dossier multimédia. Le mien est dans le dossier var. N'agetStorageData
rien à voir avec ce dont j'ai besoin. Je ne veux pas collecter tous les fichiers dans un dossier. J'ai déjà le nom du fichier.