Estou trabalhando em uma extensão do Magento 2 que requer a leitura de arquivos do sistema de arquivos.
Ao executar o php sniffer usando os padrões ECGM2, ele reclama do fato de estar usando funções como basename
ou dirname
.
É proibido o uso da função dirname ()
ou
É proibido o uso da função basename ()
Que invólucro devo usar em vez desses para obter o mesmo efeito?
[EDIT]
Aqui está um código, mas não é relevante para a questão.
Eu tenho uma classe de coleção que estende a \Magento\Framework\Data\Collection\Filesystem
classe e quero listar essa coleção em uma grade (componentes da interface do usuário) e uma das ações na grade é uma ação de download.
Para isso, preciso obter o nome real do arquivo para enviá-lo à ação de download.
// 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 {
...
}
magento2
coding-standards
filesystem
Marius
fonte
fonte
basename
lá. Por favor, leia a pergunta com atenção.Respostas:
Eu também precisava de algo assim recentemente. Única solução que encontrei para obter
basename
edirname
estava usando:Antes disso, tentei usar
Magento\Framework\Filesystem\Directory\Write
egetDriver()
sem sucesso. Com eles, você pode obter praticamente tudo, mas não obasename
.fonte
\Magento\Framework\Filesystem\Io\File
injeção na minha própria classe para uma funcionalidade diferente. Eu simplesmente não sabia de antemão sobre ogetPathInfo
método.Felizmente, o git nos permite ver quando o nome do diretório e o nome da base foram proibidos , o motivo é claramente "Arquivos adicionados"
Olhando para a questão do projeto ECG, você pode ver questões fechadas, como algo ruim em file_exists? # 33 , Funções de erro # 26 , algo de ruim nessas funções? # 17 , Contexto / explicação das regras # 12 , O uso da função iconv () é proibido # 14, o que me faria pensar que a lista inicial de funções proibidas não recebeu muita consideração, e o magento provavelmente está sujeito a alterações a lista proibida.
A pesquisa na base de código m2 mostra ~ = 78 resultados para basename, uma mistura de variáveis e o código que está chamando basename, incluindo o meu favorito .
Acho que se eu fosse você, publicaria um problema no github e perguntaria ao zlik se ele ainda acha que eles pertencem a ele ou se o M2 fornece um invólucro
fonte
Você pode usar o objeto de
SplFileInfo()
classe, se ele funcionar.pode ser que vai funcionar.
você também pode consultar este URL.
fonte
Minha sugestão seria usar o
Magento/Backup
módulo como exemplo.A maneira como a classe de ação de download é escrita seria interessante, pois também lida com arquivos reais para download:
Para mim, você deve observar a maneira como esse método gera o arquivo para download usando
\Magento\Framework\App\Response\Http\FileFactory
egenerateBackupDownloadName
deMagento\Backup\Helper\Data
(observe o uso recomendado do OM;))Outra parte interessante
Outra coisa interessante que você deve observar é o
getStorageData
método doMagento\MediaStorage\Model\ResourceModel\File\Storage\File
qual ele chama diretamentedirname
e,basename
mas se você chamar esse método principal no seu módulo, não receberá os erros proibidos;)Em uma idéia semelhante, há também o
collectFileInfo
deMagento\MediaStorage\Helper\File\Media
fonte
generateBackupDownloadName
usa alguns getters mágicos do modelo de backup. Então eles devem ter setters mágicos chamados antes. Não vejo nada relacionado ao nome da base ou uma alternativa a ele.collectFileInfo
fromMagento\MediaStorage\Helper\File\Media
;)collectFileInfo
não vai me ajudar porque espera um arquivo dentro da pasta de mídia. O meu está na pasta var. TambémgetStorageData
não tem nada a ver com o que eu preciso. Não quero coletar todos os arquivos em uma pasta. Eu já tenho o nome do arquivo.