फाइलसिस्टम सर्वोत्तम अभ्यास


11

मैं कुछ Magento 2 एक्सटेंशन पर काम कर रहा हूं जिसमें फाइल सिस्टम से फाइल पढ़ने की आवश्यकता है।
जब ECGM2 मानकों का उपयोग कर स्निफर php चल रहा है, यह सच है कि मैं जैसे कार्यों का उपयोग कर रहा बारे में शिकायत basenameया dirname

फ़ंक्शन dirname () का उपयोग निषिद्ध है

या

फ़ंक्शन बेसन () का उपयोग निषिद्ध है

समान प्रभाव प्राप्त करने के लिए मुझे क्या रैपर का उपयोग करना चाहिए?

[संपादित करें]
यहाँ कुछ कोड है, लेकिन यह सवाल के लिए प्रासंगिक नहीं है।
मेरे पास एक संग्रह वर्ग है जो कक्षा का विस्तार करता है \Magento\Framework\Data\Collection\Filesystemऔर मैं इस संग्रह को ग्रिड (यूआई-घटकों) में सूचीबद्ध करना चाहता हूं और ग्रिड में एक क्रिया एक डाउनलोड कार्रवाई है।
इसके लिए, मुझे फ़ाइल का वास्तविक नाम प्राप्त करने की आवश्यकता है ताकि मैं इसे डाउनलोड क्रिया में भेज सकूं।

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

क्या आप अपने कोड का हिस्सा साझा कर सकते हैं, जिसे आपने सिस्टम से फाइल पढ़ने की कोशिश की है।
धीरेन वसोया

मैंने कुछ कोड जोड़े, लेकिन यह सवाल के लिए पूरी तरह अप्रासंगिक है। प्रश्न किसी तरह सार है। मुझे बेसनेम के बजाय क्या उपयोग करना चाहिए ताकि कोड स्निफर को शिकायत न हो?
मारियस

इसका लुक केवल अनुमति जारी करने जैसा है।
आशीष जगनानी

इसका परमिशन से कोई लेना-देना नहीं है। कोड ठीक से काम करता है, लेकिन कोड स्निफर कहता है कि इसमें उपयोग नहीं करना चाहिए basename। कृपया प्रश्न को ध्यान से पढ़ें।
मारियस

जवाबों:


18

मुझे भी हाल ही में कुछ ऐसा चाहिए था। केवल समाधान जो मुझे मिला basenameऔर dirnameउपयोग कर रहा था:

\ Magento \ फ्रेमवर्क \ फाइलसिस्टम \ आईओ \ फ़ाइल

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\Writeऔर getDriver()कोई सफलता नहीं मिली। उनके साथ आप बहुत अधिक सब कुछ प्राप्त कर सकते हैं, लेकिन नहीं basename


हाँ। बस। धन्यवाद। जैसे ही मुझे अनुमति दी जाएगी, मैं इनाम का पुरस्कार दूंगा।
मेरियस

क्या आप वास्तव में इसे इस तरह से लागू करने जा रहे हैं? [\ Magento \ Framework \ Filesystem \ Io \ File-> getpathinfo] [1] वस्तुतः केवल [pathinfo] [२] कॉल करता है जो बदले में बेसनेम और dirname कहता है [१]: github.com/magento/magento2/blob/develop/ lib / आंतरिक / Magento /… [2]: github.com/php/php-src/blob/master/ext/standard/string.c#L1662
रिचर्ड

1
@Richard। मैंने देखा। अभी के लिए मुझे कुछ कार्यों से बचने की आवश्यकता है। और मेरे विशिष्ट मामले में यह अच्छी तरह से फिट बैठता है क्योंकि मुझे पहले से ही \Magento\Framework\Filesystem\Io\Fileएक अलग कार्यक्षमता के लिए अपनी कक्षा में इंजेक्शन लगाने का एक उदाहरण था । मैं अभी getPathInfoविधि के बारे में नहीं जानता था ।
मारियस

3

सौभाग्य से git हमें देखने देता है जब dirname और basename को निषिद्ध किया गया था , इसका कारण स्पष्ट रूप से है, "जोड़ा गया फाइलें"

ईसीजी परियोजना के लिए समस्या को देखते हुए आप फाइल_एक्सिस्ट में कुछ खराब जैसे बंद मुद्दों को देख सकते हैं ? # 33 , इस कार्य में त्रुटि कार्य # 26 , कुछ बुरा है? # 17 , नियमों के लिए संदर्भ / स्पष्टीकरण # 12 , फ़ंक्शन आइकनव () का उपयोग निषिद्ध है # 14 जो मुझे लगता है कि निषिद्ध कार्यों की प्रारंभिक सूची को बहुत अधिक ध्यान नहीं दिया गया था, और मैगनेटो शायद बदलने के लिए पर्याप्त नहीं हैं निषिद्ध सूची।

एम 2 कोडबेस की खोज करना बेसनेम के लिए ~ = 78 परिणामों को दर्शाता है, चर का मिश्रण और कोड वास्तव में बेसन नाम कह रहा है, जिसमें मेरा पसंदीदा भी शामिल है

मुझे लगता है कि अगर मैं होता तो मैं गितुब पर एक मुद्दा पोस्ट करता और ज़्लिक से पूछता कि क्या वह अभी भी सोचता है कि वे वहाँ हैं या अगर एम 2 एक आवरण प्रदान करता है


2

आप SplFileInfo()कक्षा का उपयोग कर सकते हैं यह काम कर सकता है।

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

यह काम हो सकता है

आप इस url को भी देख सकते हैं ।


इसके लिए धन्यवाद। यह क्लीनर दिखता है, लेकिन क्या आपके पास एक कोड उदाहरण है जो ऐसा करता है? मैं मुख्य मानकों का पालन करना चाहता हूं।
मेरियस

आप php.net/manual/en/splfileinfo.getfilename.php इस url का संदर्भ ले सकते हैं ।
चिराग

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\FileFactoryऔर डाउनलोड करने के लिए फ़ाइल तैयार करती generateBackupDownloadNameहै Magento\Backup\Helper\Data(ओएमपी के अनुशंसित उपयोग पर ध्यान दें।)

एक और दिलचस्प बिट

एक और दिलचस्प बात यह है कि अपने आप को देखो चाहिए 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 भी जांच collectFileInfoसे Magento\MediaStorage\Helper\File\Media);
राफेल डिजिटल Pianism पर

collectFileInfoयह मेरी मदद नहीं करेगा क्योंकि यह मीडिया फ़ोल्डर के अंदर एक फ़ाइल की उम्मीद करता है। मेरा संस्करण फ़ोल्डर में है। इसके अलावा getStorageDataमुझे जो चाहिए, उससे कोई लेना-देना नहीं है। मैं एक फ़ोल्डर में सभी फ़ाइलों को इकट्ठा नहीं करना चाहता। मेरे पास पहले से ही फ़ाइल का नाम है।
मेरियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.