尝试扩展 SonataMediaBundle "Impossible to invoke a method (" ID ") on a null variable"时出错



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

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

无法在 null 变量上调用方法("id") 奏鸣曲学说ORMAdminBundle:Form:form_admin_fields.html.twig at line 59.

我的服务声明是:

services:
gallery.admin.image:
class: GalleryBundleAdminImageAdmin
arguments: [~, GalleryBundleEntityImage, 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 SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleFormFormMapper;
use SonataClassificationBundleModelCategoryManagerInterface;
use SonataMediaBundleAdminBaseMediaAdmin;
use SonataMediaBundleAdminORMMediaAdmin;
use SonataMediaBundleProviderPool;
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 BlogBundleEntityPostTag;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
use SonataMediaBundleModelMedia;
/**
* Image
*
* @ORMTable(name="image")
* @ORMEntity(repositoryClass="GalleryBundleRepositoryImageRepository")
*/
class Image extends Media
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMManyToMany(targetEntity="BlogBundleEntityPostTag", 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的关系,错误仍然存在。

我不知道服务定义是否错误,或者我忘记了事件调用或其他内容。

我将不胜感激任何帮助。 谢谢

我的建议是:

创建构建器时,请使用"empty_on_new" => false。

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

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

你和PostTags有ManyToMany的关系。

为什么不在图像管理员中使用"sonata_type_collection"而不是"sonata_type_model"?

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

我希望它能帮助你。

祝你好运!

最新更新