Symfony 3.4.4环境下Media Bundle报错:无法对null变量调用("id")方法
我之前也碰到过这个一模一样的问题,大概率是Sonata Admin渲染Media字段时没处理好字段为空的情况,给你几个亲测可行的解决思路:
可能的解决办法
1. 检查Admin类的字段配置,确保允许空值
在你的ProductAdmin类的configureFormFields方法里,给Media字段加上required => false的配置——如果这个PDF字段不是必填项的话,一定要开这个,不然当没有上传文件时,字段值为null,模板会直接尝试调用id()方法就报错了:
use Sonata\MediaBundle\Form\Type\MediaType; // ... protected function configureFormFields(FormMapper $formMapper) { $formMapper // 其他字段... ->add('productCatalog', MediaType::class, [ 'provider' => 'sonata.media.provider.file', 'context' => 'pdf_catalog', // 要和你配置的media context对应 'required' => false, // 重点:允许空值 ]); }
2. 确认实体关联关系允许为空
检查你的Products实体里,关联Media的字段是否设置了nullable=true,确保数据库层面允许该字段为空:
/** * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media") * @ORM\JoinColumn(name="product_catalog_id", referencedColumnName="id", nullable=true) */ private $productCatalog;
3. 清理Symfony缓存
有时候缓存会导致配置不生效,执行以下命令清一下缓存:
php bin/console cache:clear --env=dev php bin/console cache:clear --env=prod
4. 自定义模板处理空值场景
如果上面的方法都没解决,你可以自定义Media字段的模板,先判断字段是否为null再渲染:
首先在Admin类里指定自定义模板:
->add('productCatalog', MediaType::class, [ 'provider' => 'sonata.media.provider.file', 'context' => 'pdf_catalog', 'required' => false, 'template' => '@App/Admin/Form/media_field.html.twig' ])
然后创建这个模板文件,添加空值判断:
{% if value is not null %} {{ sonata_admin_form_media_widget(form, value) }} {% else %} {{ form_widget(form) }} {% endif %}
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

