파일 시스템 모범 사례


11

파일 시스템에서 파일을 읽어야하는 Magento 2 확장 프로그램을 작업 중입니다.
ECGM2 표준을 사용하여 스니퍼는 PHP를 실행할 때, 내가 같은 기능을 사용하고 있다는 사실에 대해 불평 basename하거나 dirname.

dirname () 함수 사용은 금지되어 있습니다

또는

basename () 함수 사용은 금지되어 있습니다

동일한 효과를 얻으려면 래퍼 대신 어떤 래퍼를 사용해야합니까?

[편집]
여기 몇 가지 코드가 있지만 질문과 관련이 없습니다.
클래스를 확장하는 컬렉션 클래스가 있으며이 \Magento\Framework\Data\Collection\Filesystem컬렉션을 그리드 (ui 구성 요소)로 나열하고 그리드의 작업 중 하나는 다운로드 작업입니다.
이를 위해 파일의 실제 이름을 가져 와서 다운로드 작업으로 보낼 수 있습니다.

    // 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 {
       ...
    }

시스템에서 파일을 읽으려고 시도한 코드의 일부를 공유 할 수 있습니까?
Dhiren Vasoya

코드를 추가했지만 질문과는 전혀 관련이 없습니다. 문제는 어떻게 든 추상적입니다. 코드 스니퍼가 불평하지 않도록 basename 대신 무엇을 사용해야합니까?
Marius

권한 문제처럼 보입니다.
Ashish Jagnani

권한과 관련이 없습니다. 코드는 제대로 작동하지만 코드 스니퍼는 해당 코드를 사용해서는 안된다고 말합니다 basename. 질문을주의 깊게 읽으십시오.
Marius

답변:


18

나는 또한 최근에 그런 것이 필요했습니다. 내가 찾은 것을 사용 basename하고 dirname있던 솔루션 만 :

\ 마 젠토 \ 프레임 워크 \ 파일 시스템 \ Io \ 파일

protected function someFunction()
{
    /** @var \Magento\Framework\Filesystem\Io\File $fileSystemIo **/
    $fileInfo = $this->fileSystemIo->getPathInfo('<absolutePath>');
    $basename = $fileInfo['basename'] 
    $dirname = $fileInfo['dirname'];
}

그 전에 나는 사용하여 시도 Magento\Framework\Filesystem\Directory\WritegetDriver()성공하지. 그들과 함께 당신은 거의 모든 것을 얻을 수 있지만 basename.


예. 그게 다야. 감사합니다. 허용되는대로 현상금을 수여합니다.
Marius

마리우스 정말 그렇게 구현할 것입니까? [\ Magento \ Framework \ Filesystem \ Io \ File-> getpathinfo] [1]은 문자 그대로 [pathinfo] [2] 만 호출합니다.이 경로는 기본 이름과 dirname [1]을 호출합니다. github.com/magento/magento2/blob/develop/ lib / internal / Magento /… [2] : github.com/php/php-src/blob/master/ext/standard/string.c#L1662
Richard

1
@Richard. 나는 것을보고. 지금은 특정 기능을 피해야합니다. 그리고 특정 경우 \Magento\Framework\Filesystem\Io\File에는 다른 기능을 위해 이미 자체 클래스 에 주입 된 인스턴스가 있었기 때문에 잘 맞습니다 . 방금 getPathInfo방법 에 대해 미리 몰랐습니다 .
Marius

3

운 좋게 git은 dirname과 basename이 금지 된 시기를 알려줍니다 . 그 이유는 "Added files"입니다.

ECG 프로젝트의 문제를 보면 file_exists의 문제와 같은 닫힌 문제를 볼 수 있습니까? # 33 , 오류 기능 # 26 , 이 기능에 뭔가 나쁜? # 17 , 규칙 # 12에 대한 컨텍스트 / 설명 , iconv () 함수의 사용은 금지되어 있습니다 # 14 금지 된 함수의 초기 목록이 너무 많이 고려되지 않았으며, 마 젠토는 아마도 변경 될 수 있다고 생각합니다 금지 된 목록.

m2 코드베이스를 검색하면 기본 이름, 변수 조합 및 실제로 내가 좋아하는 기본 이름을 포함하여 기본 이름을 호출하는 코드에 대한 ~ ~ 78 결과가 표시됩니다 .

내가 당신이라면 내가 github에 문제를 게시하고 zlik이 여전히 그들이 거기에 있다고 생각하는지 또는 M2가 래퍼를 제공하는지 묻습니다.


2

SplFileInfo()클래스의 객체를 사용할 수 있습니다 .

$info = new SplFileInfo('/path/to/foo.txt');
var_dump($info->getFilename())

작동 할 수도 있습니다.

URL을 참조 할 수도 있습니다 .


고마워 깔끔해 보이지만이 작업을 수행하는 코드 예제가 있습니까? 핵심 표준을 따르고 싶습니다.
Marius

php.net/manual/en/splfileinfo.getfilename.php 이 URL을 참조 할 수 있습니다 .
chirag

2

내 제안은 Magento/Backup모듈을 예로 사용하는 것 입니다.

다운로드 액션 클래스가 작성되는 방식은 다운로드 할 실제 파일도 처리하므로 흥미로울 것입니다.

public function execute()
{
    /* @var $backup \Magento\Backup\Model\Backup */
    $backup = $this->_backupModelFactory->create(
        $this->getRequest()->getParam('time'),
        $this->getRequest()->getParam('type')
    );

    if (!$backup->getTime() || !$backup->exists()) {
        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();
        $resultRedirect->setPath('backup/*');
        return $resultRedirect;
    }

    $fileName = $this->_objectManager->get('Magento\Backup\Helper\Data')->generateBackupDownloadName($backup);

    $this->_fileFactory->create(
        $fileName,
        null,
        DirectoryList::VAR_DIR,
        'application/octet-stream',
        $backup->getSize()
    );

    /** @var \Magento\Framework\Controller\Result\Raw $resultRaw */
    $resultRaw = $this->resultRawFactory->create();
    $resultRaw->setContents($backup->output());
    return $resultRaw;
}

나에게 당신은이 방법을 사용하여 다운로드 할 파일을 생성하는 방법을 살펴 봐야 \Magento\Framework\App\Response\Http\FileFactorygenerateBackupDownloadName에서 Magento\Backup\Helper\Data합니다 (OM의 권장 사용 통지))

또 다른 흥미로운 비트

당신이 봐야 또 다른 흥미로운 점은있다 getStorageData에서 방법 Magento\MediaStorage\Model\ResourceModel\File\Storage\File자체가 직접 호출하는 dirname하고 basename있지만, 당신은 당신의 모듈에서 그 핵심 메서드를 호출 할 경우, 당신은 금지 오류를받지 않습니다)

public function getStorageData($dir = '/')
{
    $files = [];
    $directories = [];
    $directoryInstance = $this->_filesystem->getDirectoryRead(DirectoryList::MEDIA);
    if ($directoryInstance->isDirectory($dir)) {
        foreach ($directoryInstance->readRecursively($dir) as $path) {
            $itemName = basename($path);
            if ($itemName == '.svn' || $itemName == '.htaccess') {
                continue;
            }
            if ($directoryInstance->isDirectory($path)) {
                $directories[] = [
                    'name' => $itemName,
                    'path' => dirname($path) == '.' ? '/' : dirname($path),
                ];
            } else {
                $files[] = $path;
            }
        }
    }

    return ['files' => $files, 'directories' => $directories];
}

비슷한 생각에서, 또한 거기 collectFileInfo에서Magento\MediaStorage\Helper\File\Media


generateBackupDownloadName백업 모델에서 일부 매직 게터를 사용합니다. 그래서 그들은 전에 전화 한 마법 세터가 있어야합니다. 기본 이름이나 이와 관련된 대안이 없습니다.
Marius

@Marius는 또 다른 가능한 방법에 대한 내 업데이트 된 답변을 참조하십시오
Raphael at Digital Pianism

이 작동 할 수 있습니다. 나는 그것을 시도하고 결과로 돌아올 것이다.
Marius

@Marius도 확인 collectFileInfo에서 Magento\MediaStorage\Helper\File\Media)
라파엘 디지털 Pianism에

collectFileInfo미디어 폴더 안에 파일이 있어야하기 때문에 도움이되지 않습니다. 내 폴더는 var 폴더에 있습니다. 또한 getStorageData내가 필요한 것과 아무 관련이 없습니다. 폴더의 모든 파일을 수집하고 싶지 않습니다. 이미 파일 이름이 있습니다.
Marius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.