2 回答
TA贡献1818条经验 获得超7个赞
您可以收听事件,而不是收听 Doctrinevich_uploader.pre_remove事件。这将确保您获得每次都需要删除的旧图像。首先,确保您的 VichUploader 配置设置为在更新和删除时删除文件。这是默认设置。
# config/packages/vich_uploader.yaml
vich_uploader:
mappings:
avatar:
upload_destination: '%kernel.project_dir%/public/uploads/avatar'
uri_prefix: 'uploads/avatar'
delete_on_update: true
delete_on_remove: true
现在您需要创建侦听器。
// src/EventListener/ImageCacheSubscriber.php
namespace App\EventListener;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Vich\UploaderBundle\Event\Event;
use Vich\UploaderBundle\Event\Events;
use Vich\UploaderBundle\Storage\StorageInterface;
class ImageCacheSubscriber implements EventSubscriberInterface
{
private $storage;
private $cacheManager;
public function __construct(StorageInterface $storage, CacheManager $cacheManager)
{
$this->storage = $storage;
$this->cacheManager = $cacheManager;
}
public function onRemove(Event $event)
{
$path = $this->storage->resolveUri($event->getObject(), $event->getMapping()->getFilePropertyName());
$this->cacheManager->remove($path);
}
public static function getSubscribedEvents()
{
return [Events::PRE_REMOVE => 'onRemove'];
}
}
当移除任何 VichUploader 资产时,此侦听器将尝试将其从所有过滤器的缓存中移除。CacheManager::remove()如果您愿意,可以在方法中指定特定的过滤器。您也可以通过检查$event->getObject().
这也对您的 LiipImagine 配置做出了一些假设。如果您使用默认的加载器和缓存解析器,这应该可以工作。如果您使用自定义加载器或解析器,您可能需要根据需要修改此侦听器。
# config/packages/liip_imagine.yaml
liip_imagine:
resolvers:
default:
web_path:
web_root: '%kernel.project_dir%/public'
cache_prefix: 'media/cache'
loaders:
default:
filesystem:
data_root:
- '%kernel.project_dir%/public'
filter_sets:
cache: ~
# Your filters...
如果您使用的是 Symfony Flex,那么您就完成了。否则,请确保将侦听器注册为服务。
# config/services.yaml
services:
# ...
App\EventListener\ImageCacheSubscriber:
arguments: ['@vich_uploader.storage.file_system', '@liip_imagine.cache.manager']
tags:
- { name: kernel.event_subscriber }
TA贡献1828条经验 获得超6个赞
当您使用 VichUploaderBundle 时,不需要创建自己的侦听器。确保正确配置了生命周期事件,并且 Vich 应该负责删除旧图像。
# config/packages/vich_uploader.yaml or app/config/config.yml
vich_uploader:
db_driver: orm
mappings:
product_image:
uri_prefix: /images/products
upload_destination: '%kernel.project_dir%/public/images/products'
inject_on_load: false
delete_on_update: true
delete_on_remove: true
https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/usage.md#step-3-configure-the-lifecycle-events-optional-step
- 2 回答
- 0 关注
- 150 浏览
添加回答
举报
