ফাইল সিস্টেম সেরা অনুশীলন


11

আমি কিছু ম্যাজেন্টো 2 এক্সটেনশনে কাজ করছি যার জন্য ফাইল সিস্টেম থেকে ফাইলগুলি পড়া দরকার।
ইসিজিএম 2 স্ট্যান্ডার্ড ব্যবহার করে পিএইচপি স্নিফার চালানোর সময়, আমি basenameবা এর মতো ফাংশন ব্যবহার করছি এই বিষয়ে অভিযোগ করে 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 \ ফ্রেমওয়ার্ক \ ফাইলসিস্টেম \ 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\Writeএবং getDriver()কোন সাফল্য নেই। তাদের সাথে আপনি বেশ কিছু পেতে পারেন তবে তা নয় basename


হ্যাঁ. এটাই. ধন্যবাদ. আমার অনুমতি পাওয়ার সাথে সাথে আমি অনুগ্রহটি প্রদান করব।
মারিয়াস

মারিয়াস আপনি কি সত্যিই এটি বাস্তবায়ন করতে যাচ্ছেন? [Age ম্যাজেন্টো me ফ্রেমওয়ার্ক \ ফাইলসিস্টেম \ আইও \ ফাইল-> getpathinfo] [1] আক্ষরিকভাবে কেবল [প্যাথিনফো] কল করে [2] যা পরিবর্তে বেসনাম এবং ডাইরনাম কল করে [1]: github.com lib / অভ্যন্তরীণ / Magento
রিচার্ড

1
@Richard। আমি দেখেছি। আপাতত আমার প্রয়োজন / নির্দিষ্ট ক্রিয়া এড়াতে চাই। এবং আমার নির্দিষ্ট ক্ষেত্রে এটি দুর্দান্তভাবে ফিট করে কারণ আমি ইতিমধ্যে \Magento\Framework\Filesystem\Io\Fileআমার নিজস্ব ক্লাসে একটি ভিন্ন কার্যকারিতার জন্য ইনজেকশনের একটি উদাহরণ পেয়েছি। আমি এই getPathInfoপদ্ধতিটি সম্পর্কে সবেমাত্র জানতাম না ।
মারিয়াস

3

ভাগ্যক্রমে গিট আমাদের দেখতে দেয় যখন কখন নাম এবং বেসনাম নিষিদ্ধ করা হয়েছিল , এর কারণটি পরিষ্কার, "যুক্ত ফাইলগুলি"

ইসিজি প্রকল্পের ইস্যুটির দিকে তাকালে আপনি ফাইল-এক্সিস্টগুলিতে খারাপ কিছু যেমন বন্ধ সমস্যাগুলি দেখতে পাচ্ছেন? # 33 , ত্রুটি ফাংশন # 26 , এই ফাংশনগুলিতে কিছু খারাপ? # 17 , বিধি # 12 এর জন্য প্রসঙ্গ / ব্যাখ্যা , ফাংশন আইকনভি () ব্যবহার নিষিদ্ধ # 14 যা আমাকে ভাবতে বাধ্য করবে যে নিষিদ্ধ ফাংশনগুলির প্রাথমিক তালিকাটি খুব বেশি বিবেচনা করা হয়নি, এবং ম্যাজেন্টো সম্ভবত পরিবর্তন করার পক্ষে প্রযোজ্য নিষিদ্ধ তালিকা।

এম 2 কোডবেসটি অনুসন্ধান করে বেসনামের জন্য vari = 78 ফলাফলগুলি দেখা যায়, ভেরিয়েবলের মিশ্রণ এবং কোডটি আমার পছন্দসই সহ বেসনেজকে কল করে ।

আমি মনে করি আপনি যদি আমি থাকতাম তবে আমি গিথুবে একটি সমস্যা পোস্ট করতাম এবং জিলিককে জিজ্ঞাসা করতাম যদি সে এখনও মনে করে যে তারা সেখানে রয়েছে বা এম 2 যদি একটি আবরণ সরবরাহ করে


2

আপনি SplFileInfo()শ্রেণীর অবজেক্টটি ব্যবহার করতে পারেন এটি কাজ করবে।

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

এটা কাজ করবে হতে পারে।

আপনি এই url উল্লেখ করতে পারেন ।


এর জন্য ধন্যবাদ. এটি দেখতে আরও পরিষ্কার দেখাচ্ছে তবে আপনার কি এমন কোনও কোড উদাহরণ রয়েছে যা এটি করে? আমি মূল মান অনুসরণ করতে চাই।
মারিয়াস

আপনি এই url কে php.net/manual/en/splfileinfo.getfilename.php উল্লেখ করতে পারেন ।
চিরাগ

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ব্যাকআপ মডেল থেকে কিছু যাদু getters ব্যবহার করে। সুতরাং তাদের অবশ্যই আগে ম্যাজিক সেটারগুলি কল করা উচিত। বেসনেম বা এর বিকল্প সম্পর্কিত কোনও কিছুই আমি দেখতে পাচ্ছি না।
মারিয়াস

@ মারিয়াস আরও একটি সম্ভাব্য উপায়ের জন্য আমার আপডেট হওয়া উত্তরটি দেখুন
রাফেল ডিজিটাল পিয়ানোবাদ

এটি কাজ করতে পারে। আমি চেষ্টা করে দেখব এবং ফলাফলগুলি দিয়ে ফিরে আসব।
মারিয়াস

@Marius এছাড়াও পরীক্ষা collectFileInfoথেকে Magento\MediaStorage\Helper\File\Media);
রাফায়েল ডিজিটাল Pianism এ

collectFileInfoএটি আমাকে সহায়তা করবে না কারণ এটি মিডিয়া ফোল্ডারের ভিতরে কোনও ফাইল প্রত্যাশা করে। খনিটি ভের ফোল্ডারে রয়েছে। এছাড়াও getStorageDataআমি কি প্রয়োজন সঙ্গে কিছুই করার আছে। আমি কোনও ফোল্ডারে সমস্ত ফাইল সংগ্রহ করতে চাই না। আমার কাছে ইতিমধ্যে ফাইলটির নাম আছে।
মারিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.