Настройка пакета администрирования Sonata с помощью Symfony 4

Я пытаюсь установить Sonata Admin Bundle, чтобы легко создавать административные интерфейсы для различных объектов. Я слежу за официальной документацией (https://symfony.com/doc/master/bundles/SonataAdminBundle/getting_started/creating_an_admin.html), но столкнулся с проблемой, которую не могу решить при создании своего первого простого администратора.

Моя сущность:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;

/**
 * @ORM\Entity(repositoryClass = "App\Repository\SectorRepository")
 */
class Sector
{
    use TimestampableEntity;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @ORM\Column(type = "string", length=30)
     */
    private $name;

    /**
     * @Gedmo\Slug(fields = {"name"})
     * @ORM\Column(type = "string", length=128)
     */
    private $slug;

    /**
     * @ORM\OneToMany(targetEntity = "App\Entity\Company", mappedBy = "sector", cascade = {"persist"})
     * @ORM\JoinColumn(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 App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;

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: App\Admin\SectorAdmin
        arguments: [ ~, App\Entity\Sector, ~]
        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?

Заранее спасибо!

Все в порядке, можете ли вы предоставить трассировку стека?

kunicmarko20 10.04.2018 12:03

Привет, спасибо, что ответили. Вот трассировка стека, возвращаемая Symfony: ErrorException: pasted.co/46e0232d Ха-ха, копаясь глубже, кажется, что проблема действительно связана с другой библиотекой. Я собираюсь исследовать дальше!

TPouliquen 10.04.2018 12:12

Да, видимо проблема возникла из-за того, что я использовал определенный пакет для форматирования телефонных номеров. И это не удалось на объектах, у которых даже не было номера телефона, но хорошо .... Спасибо за внешний вид;)

TPouliquen 10.04.2018 12:23

Приятно слышать, что, поскольку ваши файлы выглядят нормально, я немного смутился. Если вы используете Slack, вы можете найти поддержку сонаты на symfony.com/slack-invite в канале #sonata.

kunicmarko20 10.04.2018 12:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
2 842
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема возникла из-за использования пакета Misd Phone Number Bundle (https://github.com/misd-service-development/phone-number-bundle).

Я до сих пор не понял почему, я отредактирую это, если найду причину ошибки или ее решение;)

Ответ принят как подходящий

Бегу к той же проблеме. Это произошло, я думаю, в symfony 3.4, где они представили новый виджет с тем же именем, что и тот, который предоставляется из пакета.

На самом деле я понятия не имею, как это решить без разрывов БК. До сих пор я использовал решение, в котором я исправляю PhoneNumberBundle и переименовываю 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') }}>

Спасибо, попробую! :)

TPouliquen 24.05.2018 11:21

Мне также пришлось переопределить PhoneNumberType и DataTransformers пакета, чтобы избавиться от некоторых ошибок (при инициализации формы Sonata дважды преобразовывала нулевое значение, что приводило к сбою). Но ваше решение направило меня на правильный путь, большое спасибо!

TPouliquen 06.06.2018 16:36

Другие вопросы по теме