Dosya sistemi en iyi uygulamaları


12

Dosya sisteminden dosya okuma gerektiren bazı Magento 2 uzantısı üzerinde çalışıyorum.
ECGM2 standartlarını kullanarak php sniffer'ı çalıştırırken, basenameveya gibi işlevleri kullandığımdan şikayet ediyor dirname.

Dirname () işlevinin kullanılması yasaktır

veya

Basename () işlevinin kullanılması yasaktır

Aynı etkiyi elde etmek için bunların yerine hangi ambalajı kullanmalıyım?

[EDIT]
İşte bazı kod, ama soru ile ilgili değil.
Sınıfı genişleten bir koleksiyon sınıfı var \Magento\Framework\Data\Collection\Filesystemve bu koleksiyonu bir kılavuzda (ui-bileşenleri) listelemek istiyorum ve kılavuzdaki eylemlerden biri bir indirme eylemidir.
Bunun için indirme eylemine gönderebilmem için dosyanın gerçek adını almam gerekiyor.

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

kodunuzun bir kısmını paylaşabilirsiniz, sistemden dosyayı okumaya çalıştıklarınız.
Dhiren Vasoya

Bazı kodlar ekledim, ancak soru için tamamen alakasız. Soru bir şekilde soyut. kod sniffer şikayet değil böylece basename yerine ne kullanmalıyım?
Marius

Sadece izin sorunu gibi görünüyor.
Ashish Jagnani

İzinlerle ilgisi yok. Kod düzgün çalışıyor, ancak kod dinleyicisi basenameorada kullanılmaması gerektiğini söylüyor . Lütfen soruyu dikkatle okuyun.
Marius

Yanıtlar:


19

Ayrıca son zamanlarda böyle bir şeye ihtiyacım vardı. Sadece bulduğum basenameve dirnamekullandığım çözüm:

\ Magento \ Framework \ Dosya Sistemi \ Io \ Dosya

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

Ondan önce kullanmayı denedim Magento\Framework\Filesystem\Directory\Writeve getDriver()başarılı olamadım. Onlarla hemen hemen her şeyi alabilirsiniz ama değil basename.


EVET. Bu kadar. Teşekkür ederim. İzin verildiği anda ödül kazanacağım.
Marius

Marius gerçekten böyle mi uygulayacaksın? [\ Magento \ Framework \ Dosya Sistemi \ Io \ Dosya-> getpathinfo] [1] kelimenin tam anlamıyla yalnızca [pathinfo] [2] 'yi çağırır ve bu da basename ve dirname [1]' i çağırır: 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. Bunu gördüm. Şimdilik belirli işlevlerden kaçınmak / kaçınmak istiyorum. Ve benim özel durumumda güzel uyuyor çünkü zaten \Magento\Framework\Filesystem\Io\Filefarklı bir işlevsellik için kendi sınıfımda enjekte edilmiş bir örneğim vardı . getPathInfoMetot hakkında açık bir şekilde bilmiyordum .
Marius

3

Neyse ki git bize dirname ve basename yasak olduğunda görelim , nedeni açıkça, "Dosya eklendi"

EKG projesi konusuna bakarak file_exists'te kötü bir şey gibi kapalı sorunları görebilirsiniz ? # 33 , Hata İşlevleri # 26 , bu işlevlerde kötü bir şey mi var? # 17 , Kural # 12 için Bağlam / Açıklama , iconv () fonksiyonunun kullanılması yasaklanmıştır # 14 , yasak fonksiyonların ilk listesine çok fazla önem verilmediğini ve eflatun muhtemelen değişime elverişli olduğunu düşündürecek yasak liste.

M2 kod tabanını aramak, basename, değişkenlerin bir karışımı ve favorim de dahil olmak üzere basename'i çağıran kod için ~ = 78 sonuç gösterir .

Sanırım ben olsaydım github ile ilgili bir mesaj gönderirim ve zlik'e hala orada olduklarını düşünüp düşünmediğini veya M2'nin bir sarıcı sağlayıp sağlamadığını sorardım


2

SplFileInfo()Sınıf nesnesi kullanabilirsiniz çalışır.

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

belki işe yarayacak.

bu url’ye de başvurabilirsiniz .


Bunun için teşekkürler. Daha temiz görünüyor, ancak bunu yapan bir kod örneğiniz var mı? Temel standartları takip etmek istiyorum.
Marius

php.net/manual/tr/splfileinfo.getfilename.php bu URL'ye başvurabilirsiniz .
chirag

2

Benim önerim Magento/Backupmodülü örnek olarak kullanmak olacaktır .

Karşıdan yükleme eylem sınıfının yazılış biçimine bakmak ilginç olurdu çünkü aynı zamanda indirilecek gerçek dosyalarla da ilgileniyor:

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;
}

Bana göre bu yöntem kullanılarak indirmek için dosyası oluşturur yolu bakmak gerekir \Magento\Framework\App\Response\Http\FileFactoryve generateBackupDownloadNamegelen Magento\Backup\Helper\Data(OM tavsiye edilen kullanım haber;))

Başka ilginç bir parça

Eğer bakmak gerekir başka ilginç şey getStorageDatagelen yöntem Magento\MediaStorage\Model\ResourceModel\File\Storage\Filekendisi doğrudan çağıran dirnameve basenameancak modülünde çekirdek yöntemini çağırırsanız, sen yasak hataları almazsınız;)

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];
}

Benzer bir fikre olarak, orada da collectFileInfogelenMagento\MediaStorage\Helper\File\Media


generateBackupDownloadNameyedekleme modelinden bazı sihirli alıcılar kullanır. Bu yüzden daha önce çağırılmış sihirli ayarlayıcıları olmalı. Basename ya da alternatif ile ilgili bir şey görmüyorum.
Marius

@Marius başka bir olası yol için güncellenmiş cevabımı görüyor
Raphael at Digital Pianism

Bu işe yarayabilir. Bir deneyeceğim ve sonuçlarla geri döneceğim.
Marius

@Marius da kontrol collectFileInfoden Magento\MediaStorage\Helper\File\Media);
Raphael Dijital pianism de

collectFileInfomedya klasöründe bir dosya beklediğinden bana yardımcı olmaz. Benimki var klasöründe. Ayrıca getStorageDataihtiyacım olanla hiçbir ilgisi yok. Bir klasördeki tüm dosyaları toplamak istemiyorum. Zaten dosya adına sahibim.
Marius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.