如何使用 YoSymfony 的 ResourceWatcher 包?

How can you use the ResourceWatcher bundle from YoSymfony?

我正在尝试制作一个文件观察器,当您添加、更新或删除文件时,您可以在数据库中看到文件更新。我正在使用框架 Symfony4 和一个来自 YoSymfony 的名为 ResourceWatcher 的包。这个 bundle 使用 Symfony 的 Finder bundle 在指定的目录中查找文件,然后 watcher 比较缓存和新文件以查看是否有任何更改。当我对 returns 路径数组的观察器使用方法时,当我尝试查看该数组时,它 returns 为空。我该如何使用这些方法及其 returns?

我把 var_dump 到处都是,发现问题出在 findChanges()->getUpdatedFiles() 和 getNewFiles();

//旧代码

    $finder = new Finder();
    $finder->files()
        ->name('*.csv')
        ->in('%kernel.root_dir%/../src/data/');

    //watcher
    $hashContent = new Crc32ContentHash();
    $resourceCache = new ResourceCachePhpFile('cache-key.php');
    $watcher = new ResourceWatcher($resourceCache, $finder, $hashContent);
    $watcher->initialize();

    if($watcher->findChanges()->hasChanges()){
        if($watcher->findChanges()->getNewFiles() === null){
            $paths = $watcher->findChanges()->getUpdatedFiles();
        }
        else{
            $paths = $watcher->findChanges()->getNewFiles();
        }

        $propertyAccessor = PropertyAccess::createPropertyAccessor();
        var_dump($propertyAccessor->getValue($paths, '[first_name]'));
        die(); 
    }

我希望能够看到路径,将它们转换成字符串并将其用于我的其他方法,使数据出现在我的数据库中。

在我的 var_dump 中,我在终端中得到 NULL。

编辑:[first_name] 在我的 csv 文件中,您可以直接转储 $paths。

//新代码

    $finder = new Finder();
    $finder->files()
        ->name('*.csv')
        ->in('%kernel.root_dir%/../src/data/');

    //watcher
    $hashContent = new Crc32ContentHash();
    $resourceCache = new ResourceCachePhpFile('cache-key.php');
    $watcher = new ResourceWatcher($resourceCache, $finder, $hashContent);
    $watcher->initialize();

    $changes = $watcher->findChanges();
    
    if(!empty($changes->getUpdatedFiles())){
        $updatedFilesPath = $changes->getUpdatedFiles();
        $pathString = implode($updatedFilesPath);
        $reader = Reader::createFromPath($pathString);
    }
    elseif(!empty($changes->getNewFiles())){
        $newFilesPath = $changes->getNewFiles();
        $pathString = implode($newFilesPath);
        $reader = Reader::createFromPath($pathString);
    }
    else{
        return;
    }

    $results = $reader->fetchAssoc();

所以它看起来就像你使用方法 findChanges()->hasChanges() 一样,它告诉观察者有一些变化但随后它重置并且观察者中不再有任何变化所以它毫无意义使用 $paths = $watcher->findChanges()->getUpdatedFiles(); 因为它总是 return 因为重置而什么都没有。我必须创建一个包含内部更改的变量,以便我可以 re-use 进一步向下更改。

代码中的详细信息...