尝试扩展 SonataMediaBundle 时出错“无法在空变量上调用方法(“id”)”

Posted

技术标签:

【中文标题】尝试扩展 SonataMediaBundle 时出错“无法在空变量上调用方法(“id”)”【英文标题】:Error trying to extend SonataMediaBundle "Impossible to invoke a method ("id") on a null variable" 【发布时间】:2018-07-03 09:59:37 【问题描述】:

我正在尝试扩展 SonataMediaBundle 的媒体类。我想生成自己的媒体来添加更多的关系和属性。

但现在我遇到了这个错误:

不可能在空变量上调用方法(“id”) SonataDoctrineORMAdminBundle:Form:form_admin_fields.html.twig 在行 59.

我的服务声明是:

services:
    gallery.admin.image:
        class: GalleryBundle\Admin\ImageAdmin
        arguments: [~, GalleryBundle\Entity\Image, SonataMediaBundle:MediaAdmin, @sonata.media.pool, @sonata.classification.manager.category]
        tags:
            -  name: sonata.admin, manager_type: orm, group: sonata_media, label_catalogue: SonataMediaBundle, label: Gallery
        calls:
            - [ setModelManager, [@sonata.media.admin.media.manager]]
            - [ setTranslationDomain, [SonataMediaBundle]]
            - [ setTemplates, [[inner_list_row: SonataMediaBundle:MediaAdmin:inner_row_media.html.twig, outer_list_rows_mosaic: SonataMediaBundle:MediaAdmin:list_outer_rows_mosaic.html.twig, base_list_field: SonataAdminBundle:CRUD:base_list_flat_field.html.twig, list: SonataMediaBundle:MediaAdmin:list.html.twig, edit: SonataMediaBundle:MediaAdmin:edit.html.twig]]]

我的管理类是:

use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\ClassificationBundle\Model\CategoryManagerInterface;
use Sonata\MediaBundle\Admin\BaseMediaAdmin;
use Sonata\MediaBundle\Admin\ORM\MediaAdmin;
use Sonata\MediaBundle\Provider\Pool;

class ImageAdmin extends BaseMediaAdmin

    public function __construct($code, $class, $baseControllerName, Pool $pool, CategoryManagerInterface $categoryManager)
    
        parent::__construct($code, $class, $baseControllerName, $pool, $categoryManager);
    

    protected function configureFormFields(FormMapper $formMapper)
    
        $formMapper
            ->with('Basic')
            ->add('tags', 'sonata_type_model', [
                'multiple' => true,
            ])
            ->end()
        ;
        parent::configureFormFields($formMapper);
    

我的实体是:

use BlogBundle\Entity\PostTag;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Sonata\MediaBundle\Model\Media;

/**
 * Image
 *
 * @ORM\Table(name="image")
 * @ORM\Entity(repositoryClass="GalleryBundle\Repository\ImageRepository")
 */
class Image extends Media

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="BlogBundle\Entity\PostTag", inversedBy="gallery_images")
     */
    protected $tags;

    public function __construct()
    
        $this->tags = new ArrayCollection();
    

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    
        return $this->id;
    

    /**
     * Add tag.
     *
     * @param PostTag $tag
     *
     * @return Image
     */
    public function addTag(PostTag $tag)
    
        $this->tags[] = $tag;

        return $this;
    

    /**
     * Remove tag.
     *
     * @param PostTag $tag
     */
    public function removeTag(PostTag $tag)
    
        $this->tags->removeElement($tag);
    

    /**
     * Get tags.
     *
     * @return Collection
     */
    public function getTags()
    
        return $this->tags;
    

我知道问题会在下一个版本中得到解决。但是对于我们当前的服务器,我们无法升级。该项目已经投入生产,我负担不起重拍。

我发现问题是因为在管理员的定义中我会有多个sonata_type_model。但无论我删除多少与 PostTags 的关系,错误仍然存​​在。

不知道是服务定义错误还是忘记了事件调用什么的。

如果有任何帮助,我将不胜感激。 谢谢

【问题讨论】:

您可能需要在字段标签上模拟关联。查看 MediaBlockService.php 文件中的 getMediaBuilder 函数。 我有几个问题,但你能先分享你创建表单的 php 行吗? (与建设者) 【参考方案1】:

我的建议是:

在创建构建器时,使用 'empty_on_new' => false。

empty_on_new(默认为 true):如果没有提供二进制内容,相关的数据转换器将返回 null 而不是空的 Media 实例

https://sonata-project.org/bundles/media/3-x/doc/reference/form.html

您与 PostTags 之间存在多对多关系。

您为什么不在 ImageAdmin 中使用“sonata_type_collection”而不是“sonata_type_model”?

https://sonata-project.org/bundles/admin/master/doc/reference/form_types.html#sonata-corebundle-form-type-collectiontype

希望对你有帮助。

祝你好运!

【讨论】:

以上是关于尝试扩展 SonataMediaBundle 时出错“无法在空变量上调用方法(“id”)”的主要内容,如果未能解决你的问题,请参考以下文章

安装 SonataMediaBundle 后映射异常

未使用 SonataMediaBundle 找到 ManagerInterface

SonataMediaBundle - S3 AWS:'配置的存储桶“我的存储桶”不存在

FOSRestbundle、JMS Serializer 和 SonataMediaBundle 返回图像的公共 url

尝试在 Python 中扩展列表时出现类型错误

尝试使用 .htaccess 文件删除 .php 扩展名时出现 403 禁止错误