使用 Symfony 4 配置 Sonata Admin Bundle



我正在尝试安装Sonata管理捆绑包,以轻松生成各种实体的管理界面。我一直在关注官方文档(https://symfony.com/doc/master/bundles/SonataAdminBundle/getting_started/creating_an_admin.html),但是在创建我的第一个简单管理员时,我遇到了一个无法解决的问题。

我的实体是 :

<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use GedmoMappingAnnotation as Gedmo;
use GedmoTimestampableTraitsTimestampableEntity;
/**
* @ORMEntity(repositoryClass="AppRepositorySectorRepository")
*/
class Sector
{
use TimestampableEntity;
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="string", length=30)
*/
private $name;
/**
* @GedmoSlug(fields={"name"})
* @ORMColumn(type="string", length=128)
*/
private $slug;
/**
* @ORMOneToMany(targetEntity="AppEntityCompany", mappedBy="sector", cascade = {"persist"})
* @ORMJoinColumn(onDelete="SET NULL")
*/
private $companies;
public function __toString()
{
return $this->name;
}
public function getId()
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(string $slug): self
{
$this->slug = $slug;
return $this;
}
public function getCompanies(): array
{
return $this->companies;
}
public function setCompanies($companies): self
{
$this->companies = $companies;
return $this;
}
}

我的管理员类如下所示:

<?php
namespace AppAdmin;
use SonataAdminBundleAdminAbstractAdmin;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleFormFormMapper;
use SymfonyComponentFormExtensionCoreTypeTextType;
class SectorAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper->add('name', TextType::class);
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper->add('name');
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper->addIdentifier('name');
}
}

我添加了此配置:

services:
admin.sector:
class: AppAdminSectorAdmin
arguments: [ ~, AppEntitySector, ~]
tags:
- { name: sonata.admin, manager_type: orm, label: Sector}
public: true

在我的奏鸣曲管理路由文件中:

admin_area:
resource: "@SonataAdminBundle/Resources/config/routing/sonata_admin.xml"
prefix: /admin
_sonata_admin:
resource: .
type: sonata_admin
prefix: /admin

正如我从文档中了解到的那样,这是注册管理员的最低配置。

但是,当我运行代码时,在数据网格筛选器的{{ form_errors(form) }}上收到错误"数组到字符串的转换"。如果我注释掉将 name 属性添加到这些过滤器的行,列表页面呈现良好,但如果我随后进入表单(创建/编辑)视图,我会在另一个元素上收到相同的错误,所以我想问题更深。

可能是与Symfony 4.x的兼容性问题吗?

提前感谢!

问题来自使用Misd Phone Number Bundle(https://github.com/misd-service-development/phone-number-bundle)。

我仍然没有弄清楚为什么,如果我找到错误的原因或解决方案,我会编辑它;)

我遇到了同样的问题。我认为它发生在symfony 3.4中,他们引入了与捆绑包中提供的小部件同名的新小部件。

实际上,我不知道如何在没有BC中断的情况下解决它。到目前为止,我已经使用了修补电话号码捆绑并将tel_widget重命名为misd_tel_widget的解决方案。

这是我的补丁 - https://pastebin.com/CnjXB1bi。我正在使用 https://github.com/cweagans/composer-patches 在作曲家文件中应用补丁。

补丁代码:

diff --git a/Form/Type/PhoneNumberType.php b/Form/Type/PhoneNumberType.php
index 58b67bf..9c31add 100644
--- a/Form/Type/PhoneNumberType.php
+++ b/Form/Type/PhoneNumberType.php
@@ -183,6 +183,6 @@ class PhoneNumberType extends AbstractType
*/
public function getBlockPrefix()
{
-        return 'tel';
+        return 'misd_tel';
}
}
diff --git a/Resources/views/Form/tel.html.twig b/Resources/views/Form/tel.html.twig
index 1fdfed4..c8064e4 100644
--- a/Resources/views/Form/tel.html.twig
+++ b/Resources/views/Form/tel.html.twig
@@ -1,4 +1,4 @@
-{% block tel_widget -%}
+{% block misd_tel_widget -%}
{% if widget is constant('Misd\PhoneNumberBundle\Form\Type\PhoneNumberType::WIDGET_COUNTRY_CHOICE') %}
<div {{ block('widget_container_attributes') }}>
{{- form_widget(form.country) -}}
diff --git a/Resources/views/Form/tel_bootstrap.html.twig b/Resources/views/Form/tel_bootstrap.html.twig
index 79f4748..7772df9 100644
--- a/Resources/views/Form/tel_bootstrap.html.twig
+++ b/Resources/views/Form/tel_bootstrap.html.twig
@@ -1,4 +1,4 @@
-{% block tel_widget -%}
+{% block misd_tel_widget -%}
{% if widget is constant('Misd\PhoneNumberBundle\Form\Type\PhoneNumberType::WIDGET_COUNTRY_CHOICE') %}
{% set attr = attr|merge({class: (attr.class|default('') ~ ' form-inline')|trim}) %}
<div {{ block('widget_container_attributes') }}>

最新更新