Liip Imagine与Vich Uploader Bundle(Symfony)联用子目录查找问题
解决方案
方法一:自定义Liip Imagine数据加载器
因为Liip默认只会读取Vich配置的基础上传目录,不知道SubdirDirectoryNamer生成的子目录结构,所以需要自定义加载器从Vich实体中获取完整的文件路径:
- 创建自定义加载器类
// src/Loader/VichUploaderLoader.php namespace App\Loader; use Liip\ImagineBundle\Binary\Loader\LoaderInterface; use Liip\ImagineBundle\Model\Binary; use Symfony\Component\HttpFoundation\File\File; use Vich\UploaderBundle\Storage\StorageInterface; class VichUploaderLoader implements LoaderInterface { public function __construct(private StorageInterface $storage) { } public function load($path) { // 路径格式为「实体类:实体ID:字段名」,例如 "App\Entity\Product:123:imageFile" [$className, $id, $fieldName] = explode(':', $path); $entityManager = $this->storage->getObjectManager(); $entity = $entityManager->find($className, $id); if (!$entity) { throw new \RuntimeException(sprintf('Entity %s#%s not found', $className, $id)); } // 通过Vich的Storage获取包含子目录的完整本地文件路径 $filePath = $this->storage->resolvePath($entity, $fieldName); $file = new File($filePath); return new Binary( file_get_contents($filePath), $file->getMimeType(), $file->getExtension() ); } }
- 注册加载器服务
# config/services.yaml services: App\Loader\VichUploaderLoader: arguments: ['@vich_uploader.storage'] tags: - { name: liip_imagine.binary.loader, loader: vich_uploader_loader }
- 配置Liip使用该加载器
# config/packages/liip_imagine.yaml liip_imagine: loaders: vich_uploader_loader: service: App\Loader\VichUploaderLoader filter_sets: # 示例缩略图过滤器配置 thumb_small: data_loader: vich_uploader_loader filters: thumbnail: { size: [100, 100], mode: outbound }
- 模板中调用方式
{{ imagine_filter('App\\Entity\\Product:' ~ product.id ~ ':imageFile', 'thumb_small') }}
方法二:直接复用Vich生成的完整路径(更简单)
如果不想写自定义类,直接利用vich_uploader_asset生成的完整路径(已包含子目录),传给Liip的默认加载器即可:
假设你的Vich配置如下:
# config/packages/vich_uploader.yaml vich_uploader: mappings: product_image: uri_prefix: /uploads/products upload_destination: '%kernel.project_dir%/public/uploads/products' directory_namer: Vich\UploaderBundle\Naming\SubdirDirectoryNamer
Liip保持默认配置即可,模板中直接组合调用:
{{ imagine_filter(vich_uploader_asset(product, 'imageFile'), 'thumb_small') }}
这个方法的核心是vich_uploader_asset已经返回了包含子目录的完整URL,Liip的默认web路径加载器可以直接识别对应的本地文件。
内容的提问来源于stack exchange,提问作者FranckGre
相关产品推荐
相关产品推荐

