在使用Liip Imagine Bundle(和Symfony3)删除文件之前检查文件是否存在于缓存中

时间:2016-05-27 14:36:39

标签: php listener symfony liipimaginebundle

似乎非常基本:我想在删除之前检查Liip Imagine Bundle缓存中是否存在文件。例如:在照片更新后,所有缓存都被删除,只有一些缩略图已经重新生成(例如175px但不是250px),我想删除相应的照片。 我正在使用听众在Symfony中这样做,正如我见过其他人那样。这是它的外观:

<?php
namespace AppBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use AppBundle\Entity\Photo;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Description of CachePhotoListener
 *
 * @author Norman
 */
class CachePhotoListener 
{
    protected $cacheManager;
    protected $request;

public function __construct($cacheManager, RequestStack $request_stack) 
{
    $this->cacheManager = $cacheManager;
    $this->request = $request_stack->getCurrentRequest();
}

public function postUpdate(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();        

    if ($entity instanceof Photo) {
        $this->cacheManager->remove($entity->userPath());
    }
}

// Case : remove photo
public function preRemove(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();

    $filters = array('thumb_prospect_250', 'thumb_prospect_175');

    foreach($filters as $filter){
        if ($entity instanceof Photo) {                
            $expectedCachePath = $this->cacheManager->getBrowserPath($entity->getPath(), $filter);            

            if (file_exists($expectedCachePath)) {
                $this->cacheManager->resolve($this->request, $entity->getPath(), $filter);
                $this->cacheManager->remove($entity->getPath());
            }
        }
    }
}

问题:即使缩略图存在,file_exists也总是返回“false”。这是$ expectedCachePath变量的示例:

'http://dev.playermanager/media/cache/thumb_prospect_250/uploads/photos/11/4d176797ca5c7dd753b23ca17b77630eeff0ba8d.jpg' (length=118)

boolean false

'http://dev.playermanager/media/cache/thumb_prospect_175/uploads/photos/11/4d176797ca5c7dd753b23ca17b77630eeff0ba8d.jpg' (length=118)

boolean false

我做错了什么? (我还尝试用“is_readable”检查文件并获得相同的结果)

2 个答案:

答案 0 :(得分:1)

好的,我设法解决了我的问题。我修改了两件事。 首先,我使用isStored方法检查Liip缓存中是否存在照片。其次,我的cacheManager-&gt;解析参数出错了,$ this-&gt;请求参数不应该在那里。

它在监听器中为我提供了以下preRemove函数:

public function preRemove(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        $filters = array('thumb_prospect_250', 'thumb_prospect_175');

        foreach($filters as $filter){
            if ($entity instanceof Photo) {                         
                $cacheExists = $this->cacheManager->isStored($entity->getPath(), $filter);        

                if ($cacheExists) {
                    $this->cacheManager->resolve($entity->getPath(), $filter);
                    $this->cacheManager->remove($entity->getPath());
                }
            }
        }
    }

答案 1 :(得分:0)

我希望在您需要目录路径时调用$this->cacheManager->getBrowserPath returns URL

您在$entity->getPath()中存储了什么?也许您可以自己检查文件是否存在于"%kernel.cache_dir%"目录中。