如何使用YoSymfony的ResourceWatcher捆绑包?

时间:2019-05-22 15:43:59

标签: php symfony4 file-watcher

我正在尝试使文件监视程序在其中添加,更新或删除文件时可以在数据库中看到文件更新。我使用的是Symfony4框架和来自YoSymfony的名为ResourceWatcher的捆绑软件。该捆绑包使用Symfony的Finder捆绑包在指定目录中查找文件,然后,观察者将缓存和新文件进行比较,以查看是否有任何更改。当我使用带有观察者的方法时,它返回一个路径数组,当我尝试查看该数组时,它返回null。我应该如何使用这些方法及其返回值?

我到处都放了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。

编辑:[名字]在我的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();

1 个答案:

答案 0 :(得分:0)

因此,当您使用方法findChanges()-> hasChanges()时,它看起来像这样,它告诉观察者有一些更改,但随后会重置并且观察者中没有任何更改,因此使用毫无意义。   $ paths = $ watcher-> findChanges()-> getUpdatedFiles(); 因为由于重置,它将始终不返回任何内容。我必须在其中包含所做的更改来创建变量,以便可以进一步重复使用这些更改。

代码中的详细信息...

  • hasChanges()已损坏,并且始终返回false,因此请不要使用它。除非我使用错了。如果是这样,请告诉我。 (我将hasChanges()放在这样的if语句中:if($ watcher-> findChanges()-> hasChanges()){// code})