Pracuję nad jakimś rozszerzeniem Magento 2, które wymaga odczytu plików z systemu plików.
Podczas uruchamiania sniffera php przy użyciu standardów ECGM2 narzeka on na fakt, że używam funkcji takich jak basename
lub dirname
.
Używanie funkcji dirname () jest zabronione
lub
Korzystanie z funkcji basename () jest zabronione
Jakiego opakowania należy użyć zamiast tych, aby uzyskać ten sam efekt?
[EDYCJA]
Oto trochę kodu, ale nie jest tak istotny dla pytania.
Mam klasę kolekcji, która ją rozszerza \Magento\Framework\Data\Collection\Filesystem
i chcę wyświetlić tę kolekcję w siatce (komponenty interfejsu użytkownika), a jedną z akcji w siatce jest akcja pobierania.
W tym celu muszę uzyskać rzeczywistą nazwę pliku, aby móc wysłać go do akcji pobierania.
// 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 {
...
}
źródło
basename
tam używać . Przeczytaj uważnie pytanie.Odpowiedzi:
Potrzebowałem też czegoś takiego ostatnio. Jedyne rozwiązanie, które znalazłem
basename
idirname
używałem:Wcześniej próbowałem używać
Magento\Framework\Filesystem\Directory\Write
igetDriver()
bez powodzenia. Dzięki nim możesz uzyskać prawie wszystko, ale niebasename
.źródło
\Magento\Framework\Filesystem\Io\File
wstrzykniętą we własnej klasie dla innej funkcjonalności. Po prostu nie wiedziałem z góry ogetPathInfo
metodzie.Na szczęście git pozwala nam zobaczyć, kiedy dirname i basename były zabronione , powód jest wyraźnie „Dodane pliki”
Patrząc na problem dotyczący projektu EKG, możesz zobaczyć zamknięte problemy, takie jak coś złego w pliku_istniejące? # 33 , Funkcje błędów # 26 , coś złego w tych funkcjach? # 17 , Kontekst / objaśnienia do reguł # 12 , Zabronione jest użycie funkcji iconv () # 14, co sprawiłoby, że pomyślałem, że początkowa lista zabronionych funkcji nie była zbytnio rozważana, a Magento prawdopodobnie można zmienić zabroniona lista.
Przeszukiwanie bazy kodu m2 pokazuje ~ = 78 wyników dla nazwy basename, mieszanki zmiennych i kodu faktycznie wywołującego basename, w tym mojego ulubionego .
Myślę, że gdybym był tobą, opublikowałbym problem na githubie i zapytał Zlik, czy nadal uważa, że one tam są, czy M2 zapewnia opakowanie
źródło
Możesz użyć obiektu
SplFileInfo()
klasy, może to zadziała.być może zadziała.
możesz również skierować ten adres URL.
źródło
Moją sugestią byłoby użycie
Magento/Backup
modułu jako przykładu.Ciekawie byłoby zobaczyć, w jaki sposób napisano klasę działania pobierania, ponieważ dotyczy ona również rzeczywistych plików do pobrania:
Do mnie należy spojrzeć na sposób metoda ta generuje plik do pobrania przy użyciu
\Magento\Framework\App\Response\Http\FileFactory
igenerateBackupDownloadName
odMagento\Backup\Helper\Data
(powiadomienia zalecanego użycia OM;))Kolejny interesujący kawałek
Inną ciekawą rzeczą, należy spojrzeć na to
getStorageData
metoda zMagento\MediaStorage\Model\ResourceModel\File\Storage\File
których sam nazywa bezpośredniodirname
ibasename
tylko jeśli wywołanie tej metody rdzenia w module, nie dostanie zabronione błędy;)W podobnym pomyśle jest też coś
collectFileInfo
zMagento\MediaStorage\Helper\File\Media
źródło
generateBackupDownloadName
wykorzystuje niektóre magiczne metody pobierania z modelu zapasowego. Więc muszą wcześniej wezwać seterów magii. Nie widzę nic związanego z basename ani alternatywy dla niego.collectFileInfo
odMagento\MediaStorage\Helper\File\Media
;)collectFileInfo
nie pomoże mi, ponieważ oczekuje pliku w folderze multimediów. Mój jest w folderze var. NiegetStorageData
ma też nic wspólnego z tym, czego potrzebuję. Nie chcę zbierać wszystkich plików w folderze. Mam już nazwę pliku.