Ich arbeite an einer Magento 2-Erweiterung, die das Lesen von Dateien aus dem Dateisystem erfordert.
Wenn der PHP-Sniffer unter Verwendung der ECGM2-Standards ausgeführt wird, beschwert er sich über die Tatsache, dass ich Funktionen wie basename
oder verwende dirname
.
Die Verwendung der Funktion dirname () ist verboten
oder
Die Verwendung der Funktion basename () ist verboten
Welchen Wrapper sollte ich anstelle dieser verwenden, um den gleichen Effekt zu erzielen?
[BEARBEITEN]
Hier ist ein Code, der jedoch für die Frage nicht so relevant ist.
Ich habe eine Sammlungsklasse, die die \Magento\Framework\Data\Collection\Filesystem
Klasse erweitert, und ich möchte diese Sammlung in einem Raster (UI-Komponenten) auflisten. Eine der Aktionen im Raster ist eine Download-Aktion.
Dazu muss ich den tatsächlichen Namen der Datei erhalten, damit ich sie an die Download-Aktion senden kann.
// 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 {
...
}
quelle
basename
werden sollte. Bitte lesen Sie die Frage sorgfältig durch.Antworten:
Ich brauchte in letzter Zeit auch so etwas. Einzige Lösung, die ich gefunden habe
basename
und die ichdirname
verwendet habe:Vorher habe ich versucht
Magento\Framework\Filesystem\Directory\Write
undgetDriver()
ohne Erfolg. Mit ihnen kann man so ziemlich alles bekommen, aber nicht dasbasename
.quelle
\Magento\Framework\Filesystem\Io\File
in meiner eigenen Klasse für eine andere Funktionalität injiziert hatte. Ich wusste einfach nicht im Voraus über diegetPathInfo
Methode Bescheid .Zum Glück können wir mit git sehen, wann dirname und basename verboten waren. Der Grund dafür ist eindeutig "Hinzugefügte Dateien".
Wenn Sie sich das Problem für das EKG-Projekt ansehen, sehen Sie geschlossene Probleme, z. B. etwas Schlechtes in file_exists? # 33 , Fehlerfunktionen # 26 , etwas Schlechtes an diesen Funktionen? # 17 , Kontext / Erklärung für die Regeln # 12 , Die Verwendung der Funktion iconv () ist verboten # 14, was mich denken lassen würde, dass die anfängliche Liste der verbotenen Funktionen nicht zu sehr berücksichtigt wurde und Magento wahrscheinlich geändert werden kann die verbotene Liste.
Das Durchsuchen der m2-Codebasis zeigt ~ = 78 Ergebnisse für den Basisnamen, eine Mischung aus Variablen und den Code, der tatsächlich den Basisnamen aufruft, einschließlich meines Favoriten .
Ich denke, wenn ich du wäre, würde ich ein Problem auf Github posten und zlik fragen, ob er immer noch glaubt, dass sie dorthin gehören oder ob M2 einen Wrapper bereitstellt
quelle
Sie können ein Objekt der
SplFileInfo()
Klasse verwenden, möglicherweise funktioniert es.Vielleicht wird es funktionieren.
Sie können auch auf diese URL verweisen .
quelle
Mein Vorschlag wäre, das
Magento/Backup
Modul als Beispiel zu verwenden.Es wäre interessant zu sehen, wie die Download-Aktionsklasse geschrieben ist, da sie sich auch mit realen Dateien zum Herunterladen befasst:
Für mich sollten Sie sich ansehen, wie diese Methode die Datei generiert, die mit
\Magento\Framework\App\Response\Http\FileFactory
undgenerateBackupDownloadName
von heruntergeladen werden sollMagento\Backup\Helper\Data
(beachten Sie die empfohlene Verwendung des OM;))Ein weiteres interessantes Stück
Eine weitere interessante Sache , die Sie betrachten sollten , ist die
getStorageData
Methode ausMagento\MediaStorage\Model\ResourceModel\File\Storage\File
dem sich Anrufe direktdirname
undbasename
aber , wenn Sie diese Kernmethode in Ihrem Modul aufrufen, werden Sie nicht die verbotenen Fehler bekommen;)In einer ähnlichen Idee gibt es auch die
collectFileInfo
vonMagento\MediaStorage\Helper\File\Media
quelle
generateBackupDownloadName
verwendet einige magische Getter aus dem Backup-Modell. Also müssen sie vorher magische Setter haben. Ich sehe nichts im Zusammenhang mit dem Basisnamen oder einer Alternative dazu.collectFileInfo
vonMagento\MediaStorage\Helper\File\Media
;)collectFileInfo
hilft mir nicht, weil es eine Datei im Medienordner erwartet. Meins befindet sich im Ordner var. HatgetStorageData
auch nichts mit dem zu tun was ich brauche. Ich möchte nicht alle Dateien in einem Ordner sammeln. Ich habe bereits den Dateinamen.