Проверьте, существует ли файл в кеше, прежде чем удалять его с помощью Liip Imagine Bundle (и Symfony3)

Кажется очень простым: я хочу проверить, существует ли файл в кеше 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» и получил те же результаты)


person user3389015    schedule 27.05.2016    source источник


Ответы (2)


Хорошо, мне удалось решить мою проблему. Я изменил две вещи. Сначала я проверил наличие фото в кеше Liip методом isStored. Во-вторых, в моих параметрах cacheManager->resolve была ошибка, параметра $this->request не должно было быть.

Что дает мне следующую функцию 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());
                }
            }
        }
    }
person user3389015    schedule 29.05.2016

Я думаю, что вызов $this->cacheManager->getBrowserPath возвращает URL, когда вы хотите путь к каталогу.

Что вы храните в $entity->getPath()? Возможно, вы можете сами проверить, существует ли файл в каталоге "%kernel.cache_dir%".

person martin    schedule 28.05.2016
comment
$entity-›getPath() возвращает относительный URL-адрес, выглядящий так: uploads/photos/1/13cf43e720b12bdcafff8a002e046e186559cdc0.jpg Тем временем я нашел решение, но как именно проверить, существует ли файл с %kernel.cache_dir% ? - person user3389015; 29.05.2016