Symfony调用数据库存储资源时asset()函数报错解决
这个报错和你写的视频路径没有关系,是项目静态资源配置默认开启了Webpack Encore/Asset Mapper的manifest映射模式:开启后asset()函数会强制读取public/build/manifest.json做资源路径映射,你没有执行前端构建生成这个文件,不管传入什么路径都会直接抛出这个异常。
根据你项目的实际使用场景二选一即可:
如果你项目本身没有用Webpack Encore或者Asset Mapper管理前端编译资源
直接关闭manifest读取逻辑即可:- 打开项目根目录下的
config/packages/framework.yaml配置文件 - 找到
assets配置段,删除或注释掉json_manifest_path配置项,修改后的参考配置如下:
framework: assets: # 注释/删除下面这行,就不会强制查找manifest文件 # json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'- 执行命令清除项目缓存:
php bin/console cache:clear操作完成后你原来写的
{{ asset(commande.lienVideo)}}就可以正常生成资源路径了,你数据库里存的相对路径不要带开头斜杠,asset函数会自动补全站点根路径,对应你存的Commande/test/a/2362022a.mp4,最终渲染出来的访问路径是/Commande/test/a/2362022a.mp4,和你public目录下的实际存放位置完全匹配。- 打开项目根目录下的
如果你项目本身就是用Webpack Encore管理前端资源
只需要在项目根目录执行一次前端构建命令,生成缺失的manifest文件即可:# 依赖用npm管理的话执行 npm run build # 依赖用yarn管理的话执行 yarn build构建完成后
public/build/目录下会自动生成manifest.json,asset()函数就可以正常运行。注意你自己存的视频这类静态文件不要放到public/build目录下,就按你现在的目录结构放在public下的自定义目录即可,asset()函数识别到不在manifest映射列表里的路径,会直接按原路径生成访问地址,不会出现报错。
你写的video标签里type属性填的是video/webm,但实际文件是mp4格式,记得改成video/mp4,否则部分浏览器会因为格式识别失败无法播放视频,正确的标签写法参考:
<video controls> <source src="{{ asset(commande.lienVideo)}}" type="video/mp4"> </video>
内容的提问来源于stack exchange,提问作者Eileen Balaguer

