Установка и настройка Sonata Admin на Symfony 4


    Приветствую всех. В данной статье поговорим об Symfony 4 и Sonata Admin.


    В процессе установки я столкнулся с массой неточностей в документации и сама документация была раскидана по нескольким местам. Здесь я рассмотрю весь процесс, начиная от создания проекта и заканчивая авторизацией вместе с аутентификацией.


    Отдельные части настроек взяты из официальной документации, часть бралась из комментариев на GitHub, где обсуждались проблемы при установке. Также расписаны возможные подводные камни и пути их обхода.


    Создаем проект на symfony


    $ composer create-project symfony/skeleton sonatademo

    $ cd sonatademo

    Для работы с встроенным веб сервером Symfony нужно установить Symfony Client.


    Запускаем.


    $ symfony serve

    Переходим по ссылке http://127.0.0.1:8000/ и получим стандартное приветствие Symfony. Значит все работает корректно.



    Устанавливаем Sonata Admin


    $ composer require sonata-project/admin-bundle

    Sonata Admin и БД


    Для того, чтобы взаимодействовать с базой данных нужно установить одну из трех библиотек:



    В данной статья я использую SonataDoctrineORMAdminBundle, что более чем достаточно для работы с MySQL или Sqlite.


    Устанавливаем SonataDoctrineORMAdminBundle.


    $ composer require sonata-project/doctrine-orm-admin-bundle

    Теперь настроим работу с Sqlite.


    Открываем .env файл и в секции ###> doctrine/doctrine-bundle ### меняем DATABASE_URL.


    DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"

    Так как Symfony Flex делает почти все работу за нас при установке, то остается сделать несколько манипуляций для получения конечного результата.


    # config/packages/framework.yaml
    framework:
        translator: { fallbacks: ['en'] }

    Выполняем


    $ composer dump-env dev

    Теперь переходим по ссылке http://127.0.0.1:8000/admin и видим пустой стандартный административный интерфейс.



    Создание сущностей


    Создадим две сущности для примера, связанные между собой связью один ко многим.


    <?php
    // src/Entity/City.php
    namespace App\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     */
    class City
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer", options={"unsigned":true})
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string")
         */
        private $title;
    
        /**
         * @var string
         *
         * @ORM\Column(type="text")
         */
        private $description;
    
        /**
         * @var bool
         *
         * @ORM\Column(type="boolean")
         */
        private $isBig = false;
    
        /**
         * @ORM\OneToMany(targetEntity="Address", mappedBy="city")
         */
        private $addresses;
    
        public function __construct()
        {
            $this->addresses = new ArrayCollection();
        }
    
        public function getAddresses()
        {
            return $this->addresses;
        }
    
        /**
         * @return string
         */
        public function getTitle(): ?string
        {
            return $this->title;
        }
    
        /**
         * @param string $title
         * @return City
         */
        public function setTitle(string $title): City
        {
            $this->title = $title;
            return $this;
        }
    
        /**
         * @return string
         */
        public function getDescription(): ?string
        {
            return $this->description;
        }
    
        /**
         * @param string $description
         * @return City
         */
        public function setDescription(string $description): City
        {
            $this->description = $description;
            return $this;
        }
    
        /**
         * @return bool
         */
        public function isBig(): ?bool
        {
            return $this->isBig;
        }
    
        /**
         * @param bool $isBig
         * @return City
         */
        public function setIsBig(bool $isBig): City
        {
            $this->isBig = $isBig;
            return $this;
        }
    
        public function __toString()
        {
            return $this->title;
        }
    }

    <?php
    // src/Entity/Address.php
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     */
    class Address
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer", options={"unsigned":true})
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string")
         */
        private $title;
    
        /**
         * @var string
         *
         * @ORM\Column(type="text")
         */
        private $description;
    
        /**
         * @ORM\ManyToOne(targetEntity="City", inversedBy="addresses")
         */
        private $city;
    
        /**
         * @return string
         */
        public function getTitle(): ?string
        {
            return $this->title;
        }
    
        /**
         * @param string $title
         * @return Address
         */
        public function setTitle(string $title): Address
        {
            $this->title = $title;
            return $this;
        }
    
        /**
         * @return string
         */
        public function getDescription(): ?string
        {
            return $this->description;
        }
    
        /**
         * @param string $description
         * @return Address
         */
        public function setDescription(string $description): Address
        {
            $this->description = $description;
            return $this;
        }
    
        /**
         * @return City
         */
        public function getCity(): ?City
        {
            return $this->city;
        }
    
        /**
         * @param City $city
         * @return Address
         */
        public function setCity(City $city)
        {
            $this->city = $city;
            return $this;
        }
    
        public function __toString()
        {
            return $this->title;
        }
    }

    Синхронизируемся с БД.


    bin/console doctrine:schema:create

    Настройка сущностей для Sonata Admin


    Нужно для каждой сущности создать отдельный файл с описанием, как Sonata Admin должна работать.


    <?php
    
    // src/Admin/CityAdmin.php
    
    namespace App\Admin;
    
    use App\Entity\Address;
    use App\Entity\City;
    use Sonata\AdminBundle\Admin\AbstractAdmin;
    use Sonata\AdminBundle\Datagrid\ListMapper;
    use Sonata\AdminBundle\Datagrid\DatagridMapper;
    use Sonata\AdminBundle\Form\FormMapper;
    use Sonata\AdminBundle\Form\Type\CollectionType;
    use Sonata\AdminBundle\Form\Type\ModelType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    
    final class CityAdmin extends AbstractAdmin
    {
        protected function configureFormFields(FormMapper $formMapper)
        {
            $formMapper->add('title', TextType::class);
            $formMapper->add('description', TextareaType::class);
            $formMapper->add('isBig', CheckboxType::class);
        }
    
        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
        {
            $datagridMapper->add('title');
            $datagridMapper->add('isBig');
        }
    
        protected function configureListFields(ListMapper $listMapper)
        {
            $listMapper->addIdentifier('title');
            $listMapper->addIdentifier('isBig');
        }
    }

    <?php
    
    // src/Admin/AddressAdmin.php
    
    namespace App\Admin;
    
    use App\Entity\City;
    use Sonata\AdminBundle\Admin\AbstractAdmin;
    use Sonata\AdminBundle\Datagrid\ListMapper;
    use Sonata\AdminBundle\Datagrid\DatagridMapper;
    use Sonata\AdminBundle\Form\FormMapper;
    use Sonata\AdminBundle\Form\Type\ModelType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    
    final class AddressAdmin extends AbstractAdmin
    {
        protected function configureFormFields(FormMapper $formMapper)
        {
            $formMapper->add('title', TextType::class);
            $formMapper->add('description', TextareaType::class);
            $formMapper->add('city', ModelType::class, [
                'class' => City::class,
                'property' => 'title',
            ]);
        }
    
        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
        {
            $datagridMapper->add('title');
        }
    
        protected function configureListFields(ListMapper $listMapper)
        {
            $listMapper->addIdentifier('title');
        }
    }

    Эти классы нужно описать в service.yaml.


    # config/service.yaml
    services:
        ...
        App\Admin\CityAdmin:
            arguments: [~, App\Entity\City, ~]
            tags:
                - { name: sonata.admin, manager_type: orm, label: City }
        App\Admin\AddressAdmin:
            arguments: [~, App\Entity\Address, ~]
            tags:
                - { name: sonata.admin, manager_type: orm, label: Address }

    Если при заходе в административную часть возникают ошибки, например Unable to generate a URL for the named route, то нужно почистить кэш приложения и попробовать снова.


    bin/console cache:clear

    Теперь, если перейти по ссылке http://127.0.0.1:8000/admin увидим список из двух элементов Address и City, где можно просматривать списки и создавать новые сущности.



    Авторизация и аутентификация


    Для начала создадим сущность пользователя.


    <?php
    // src/Entity/User.php
    namespace App\Entity;
    
    use Sonata\UserBundle\Entity\BaseUser as BaseUser;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_user")
     */
    class User extends BaseUser
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer", options={"unsigned":true})
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    }

    И заодно создадим сущность группы пользователя.


    <?php
    // src/Entity/Group.php
    namespace App\Entity;
    
    use Sonata\UserBundle\Entity\BaseGroup as BaseGroup;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_group")
     */
    class Group extends BaseGroup
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer", options={"unsigned":true})
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @return int
         */
        public function getId()
        {
            return $this->id;
        }
    }

    После настроим Twig как движок шаблонов.


    framework:
        ...
        templating:
            engines: ['twig']

    На данный момент есть проблемы с работой Symfony Flex и FOSUserBundle. Более подробно можно узнать по ссылкам #2562, #2708 и #2801.


    Пока данные проблемы не решены, нужно сделать пару дополнительных манипуляций перед установкой Sonata User Bundle.


    # config/service.yaml
    services:
        ...
        mailer:
            alias: fos_user.mailer.noop
            public: true

    # config/packages/fos_user.yaml
    fos_user:
      db_driver: orm
      firewall_name: main
      user_class: App\Entity\User
      registration:
        confirmation:
          enabled: false
      from_email:
        address: '%env(MAILER_USER_ADDRESS)%'
        sender_name: '%env(MAILER_USER_NAME)%'
      service:
        user_manager: sonata.user.orm.user_manager
        mailer: 'fos_user.mailer.noop'
      group:
        group_class:   App\Entity\Group
        group_manager: sonata.user.orm.group_manager

    После чего, можно устанавливать бандл.


    $ composer require sonata-project/user-bundle

    Настройка ACL


    В Symfony 4 ACL вынесли в отдельный бандл symfony/acl-bundle. Поэтому его нужно отдельно установить.


    composer require symfony/acl-bundle

    # config/packages/sonata_user.yaml
    sonata_user:
        security_acl: true
        manager_type: orm

    # config/packages/acl.yaml
    acl:
        connection: default

    Настройка Doctrine


    # config/packages/doctrine.yaml
    doctrine:
        orm:
             mappings:
                 SonataUserBundle: ~
                 FOSUserBundle: ~

    Настройка работы с почтой


    Так как в рамках этой статьи работа с почтой не рассматриватеся, то укажем заглушку вместо реального сервиса.


    # config/packages/sonata_user.yaml
    
    sonata_user:
        mailer: fos_user.mailer.noop

    Интеграция User Bundle в Sonata Admin


    # config/routes.yaml
    sonata_user_admin_security:
        resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
        prefix: /admin
    
    sonata_user_admin_resetting:
        resource: '@SonataUserBundle/Resources/config/routing/admin_resetting.xml'
        prefix: /admin/resetting

    # config/packages/security.yaml
    security:
        encoders:
            FOS\UserBundle\Model\UserInterface: sha512
        providers:
            fos_userbundle:
                id: fos_user.user_provider.username
        role_hierarchy:
            ROLE_ADMIN:       [ROLE_USER, ROLE_SONATA_ADMIN]
            ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
        firewalls:
            dev:
                pattern:  ^/(_(profiler|wdt)|css|images|js)/
                security: false
    
            # -> custom firewall for the admin area of the URL
            admin:
                pattern:            /admin(.*)
                context:            user
                form_login:
                    provider:       fos_userbundle
                    login_path:     /admin/login
                    use_forward:    false
                    check_path:     /admin/login_check
                    failure_path:   null
                logout:
                    path:           /admin/logout
                    target:         /admin/login
                anonymous:          true
    
            # -> end custom configuration
    
            # default login area for standard users
    
            # This firewall is used to handle the public login area
            # This part is handled by the FOS User Bundle
            main:
                pattern:             .*
                context:             user
                form_login:
                    provider:       fos_userbundle
                    login_path:     /login
                    use_forward:    false
                    check_path:     /login_check
                    failure_path:   null
                logout:             true
                anonymous:          true
        access_control:
            # Admin login page needs to be accessed without credential
            - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/admin/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    
            # Secured part of the site
            # This config requires being logged for the whole site and having the admin role for the admin part.
            # Change these rules to adapt them to your needs
            - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
            - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
    

    # config/packages/sonata_user.yaml
    sonata_user:
      ...
      class:
        user: App\Entity\User
        group: App\Entity\Group

    Теперь можно обновить ACL и БД.


    $ bin/console acl:init

    $ php bin/console doctrine:schema:update --force

    Создаем супер пользователя. Указываем имя demo и пароль demo.


    $ bin/console fos:user:create --super-admin
    Please choose a username:demo
    Please choose an email:demo@demo.com
    Please choose a password:
    Created user demo

    Для корректной настройки наших Admin классов вместе с ACL нужно внести изменения в настройки.


    sonata_admin:
        ...
        security:
             handler: sonata.admin.security.handler.acl

    После запустить следующее:


    $ bin/console sonata:admin:setup-acl
    Starting ACL AdminBundle configuration
     > install ACL for App\Admin\AddressAdmin
       - add role: ROLE_APP\ADMIN\ADDRESSADMIN_GUEST, permissions: ["LIST"]
       - add role: ROLE_APP\ADMIN\ADDRESSADMIN_STAFF, permissions: ["LIST","CREATE"]
       - add role: ROLE_APP\ADMIN\ADDRESSADMIN_EDITOR, permissions: ["OPERATOR","EXPORT"]
       - add role: ROLE_APP\ADMIN\ADDRESSADMIN_ADMIN, permissions: ["MASTER"]
     > install ACL for App\Admin\CityAdmin
       - add role: ROLE_APP\ADMIN\CITYADMIN_GUEST, permissions: ["LIST"]
       - add role: ROLE_APP\ADMIN\CITYADMIN_STAFF, permissions: ["LIST","CREATE"]
       - add role: ROLE_APP\ADMIN\CITYADMIN_EDITOR, permissions: ["OPERATOR","EXPORT"]
       - add role: ROLE_APP\ADMIN\CITYADMIN_ADMIN, permissions: ["MASTER"]
     > install ACL for sonata.user.admin.user
       - add role: ROLE_SONATA_USER_ADMIN_USER_GUEST, permissions: ["LIST"]
       - add role: ROLE_SONATA_USER_ADMIN_USER_STAFF, permissions: ["LIST","CREATE"]
       - add role: ROLE_SONATA_USER_ADMIN_USER_EDITOR, permissions: ["OPERATOR","EXPORT"]
       - add role: ROLE_SONATA_USER_ADMIN_USER_ADMIN, permissions: ["MASTER"]
     > install ACL for sonata.user.admin.group
       - add role: ROLE_SONATA_USER_ADMIN_GROUP_GUEST, permissions: ["LIST"]
       - add role: ROLE_SONATA_USER_ADMIN_GROUP_STAFF, permissions: ["LIST","CREATE"]
       - add role: ROLE_SONATA_USER_ADMIN_GROUP_EDITOR, permissions: ["OPERATOR","EXPORT"]
       - add role: ROLE_SONATA_USER_ADMIN_GROUP_ADMIN, permissions: ["MASTER"]

    Теперь при попытке зайти по адресу http://127.0.0.1:8000/admin нас перенаправит на http://127.0.0.1:8000/admin/login.



    Вводим demo/demo и попадаем в административную часть.



    Итоги


    После всех манипуляций мы получили работающую административную часть Sonata Admin на Symfony 4 вместе с аутентификацией и авторизацией c помощью Sonata User + ACL.


    Всем спасибо. Если будут вопросы и замечания, то я выслушаю их в комментариях.

    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 24

      0
      Просьба, если ставите минус статье, то аргументировать в комментарии, что не понравилось. Это позволит мне в будущем исправить ошибки.
        –1
        Я минус не ставил, но, полагаю, дело в том, что вы де-факто опубликовали перевод мануала:
        symfony.com/doc/master/bundles/SonataAdminBundle/getting_started/installation.html
        symfony.com/doc/master/bundles/SonataAdminBundle/getting_started/creating_an_admin.html
        В этом, конечно, нет ничего плохого, но и полезного мало — кому интересны SonataAdmin и Symfony едва-ли будут испытывать трудности с установкой всего этого добра по официальной инструкции.
          +1
          Вот здесь я бы поспорил, установка данной системы по офф инструкции может быть той еще проблемой (причем не решенной). Я за все время разработки, раз 5 пытался подружить sonata + symfony, еще ни разу нормального из этого ничего не вышло, то крашилось все из-за несоответствия каких-то версий, то еще какие проблемы, на которые гугл не смог дать ответ. В итоге все забрасывалось и приходилось выбирать другой фреймворк (К примеру, Laravel) или другую админку.
          P.S. Я не утверждаю что я гуру php и symfony, но если данный мануал действенный и полностью рабочий, то автору, как говорится, «респект и уважуха»)
            0
            Он полностью рабочий на данный момент. В будущем опять все может поменяться. Попробуйте проделать все, что описано в статье, было бы интересно увидеть воспроизводимость не только у меня.
          +1

          Я минусы не ставил — кармы не хватает, но претензия есть. Ваша статья совсем для нубов. Всё выше описанное есть в документации и ваш перевод не имеет никакой ценности.
          Если вы хотите что-то написать про Symfony — пишите о каких-то сложных, интересных и/или нетривиальных решениях, которые не описаны в документации, но вы нашли как это сделать с помощью этого фреймворка.
          О том, что вы описали уже существует множество статей, в том числе и на русском языке: [1] [2] [3]. Тысячная статья по установке Symfony, Sonata Admin Bundle, и вы удивляетесь за что минусы? Вы это серьёзно? Люди, которые заинтересованы каким-либо инструментом, уверен, найдут всё необходимое либо на StackOverflow, либо в официальной документации к инструменту, ну а если они не желают учить английский для понимания того, с чем они работают, — значит эта профессия не для них, потому что в этой сфере знание английского уже является де-факто стандартом


          [1]: https://devacademy.ru/article/symfony-2-joboard-nachinaem-proekt/
          [2]: https://devacademy.ru/article/obzor-komponentov-symfony2-avtorizatsiya/
          [3]: https://devacademy.ru/article/symfony-2-joboard-interfejs-administratora/

          –2

          минусов не ставил, но так, ИМХО — зачем соната, если есть https://github.com/EasyCorp/EasyAdminBundle
          и зачем symfony-acl если есть https://symfony.com/doc/current/security/voters (ну, по крайней мере, в большинстве случаев этого достаточно)

            0
            А какие есть системы для проверки доступа, например есть посты (10 штук), у пользователя есть доступ только к 4, как при листинге и пагинации выводить только те посты которые доступны пользователю?
            0
            Эх, никто не читает вводный текст статьи. Я не спорю, что гайдов масса, но есть НО.

            Сейчас в основном гайды писались до Symfony 4, с тех пор немного все поменялось и по старым гайдам уже нельзя без проблем все установить. Появились подводные камни, которые можно обойти, но для этого надо искать решение в GitHub разных репозиториев. Весть этот процесс у меня занял день, если бы у меня был актуальный гайд, то потратил бы я не больше часа.

            Так что все таки эта статья несет в себе какую-то ценность.
              0
              У вас итог не верный. Это не законченная статья

              По крайней мере проблемы с которыми я столкнулся, начав изучать Symfony + EasyAdmin
              — Загрузка файлов/изображений, множественная загрузка
              — AJAX на добавление/изменение Entinty
              — Сортировка, фильтрация в grid по колонкам
              — …

              Проблем полно, из статьи не видно, что вы с ними сталкивались. Проще и намного быстрее сделать CRUD без сонаты. Не видно преимуществ.
                0
                Спасибо за идеи для еще одной статьи. Обязательно после написания укажу как продолжение в конце этого материала.

                Да, верно вы подметили, что с вашими проблемами я пока не сталкивался, потому что мне было достаточно того, что я описал в статье.

                CRUD можно и без Sonata сделать, но перед этим нужно задать себе вопрос — этот проект будет развиваться дальше или нет. От ответа зависит выбор CRUD или Sonata. Если проект будет развиваться, то однозначно Sonata или аналоги. Банально поддержка своего CRUD будет обходится дороже. Если проект типа сайта визитки с парой табличек, то здесь можно и самому написать.
                  0

                  Точнее все строго наоборот.


                  Если проект будет развиваться, то первым делом надо будет выпилить сонату

                    0

                    Расскажите о своём опыте. Наверняка у вас есть что сказать про ограничения и недостатки Sonata Admin. Я эту библиотеку не защищаю, она просто в топе Google при поиске административной части для Symfony.

                      0
                      По мере перехода к логике бизнеса (а не CRUD) у вас будет появляться все больше и больше кастомных страниц.
                      В итоге внезапно выясниться что практически ничего из того что есть в Сонате вас не удовлетворяет потому что стандартное не совсем подходит бизнесу, а нестандартное писать мешает сама Соната (есть альтернатива расширения — просто вписывать нужные вам рендеры самостоятельно сделанных страниц и действий на ее роуты — но тут возникает вопрос, а зачем собственно говоря вам тогда сама Соната?)

                      В общем чем больше у вас разной логики взаимодействия — тем хуже под нее подходят стандартные рецепты предлагаемые вам этим расширением.
              +1
              Запускаем встроенный веб сервер Symfony.

              symfony serve


              Эта команда доступна только после установки Symfony CLI которая далеко не встроена в Symfony это отдельное приложение со своим инсталятором под каждую OS.
                0
                Спасибо, дополнил.
                +1

                До этой статьи я сам устанавливал по офф. документации и решил попробовать установить как в этой статье.
                Я так понял подводные камни немного оставили для читателей статьи.
                Например вы пишите:


                # config/packages/framework.yaml
                framework:
                    translator: { fallbacks: ['%locale%'] }

                Даёт ошибку.


                You have requested a non-existent parameter "locale".

                и это очевидно, т.к. нужно указать locale в параметрах (например в services.yaml):


                # config/services.yaml
                parameters:
                    locale: 'ru'
                  0
                  Спасибо за замечание. Действительно при написании статьи в сам материал этот кусок вставил, а вот в проект не добавил и поэтому пропустил. Исправил.
                  0
                  Вот бы мне такого программиста на Symfony4)
                  Извините что не по теме
                    0
                    Sonata кидает тысячи deprecation-ов в логи.
                    Как у них с развитием, знает кто-нибудь? В смысле, дальше-то пилят или всё?
                      0
                      Могу ответить только опосредовано. Судя по коммитам, то какое-то развитие есть. Смотрели issues на github? Есть там что об такого рода ошибках?
                      +1
                      тихо, по инструкции, не ставится уже на первых шагах. Т.е. нубы, как автор коммента, не смогут поставить. На этапе ORM возникли проблемы. Symfony крут тем, что если официальным ман написан, то он работает. Было бы здорово, если и комьюнити придерживалось этой политики.
                        0

                        Опишите более подробно что сделали и что получили, это поможет мне понять и помочь вам

                        +1
                        Добрый день. Спасибо за сжатую статью, которая спасает от выпадения глаз при вычитывании тонн документации. Спасает при знакомстве с Симфони. К сожалению, возникли некоторые проблемы, так как сжатый характер статьи имеет и обратную сторону. Банально не хватает комментариев, «что, зачем, какие варианты».

                        Во-первых, можете уточнить по тексту:
                        1) у вас тут идёт:
                        Устанавливаем Sonata Admin
                        $ composer require sonata-project/admin-bundle
                        Для того, чтобы взаимодействовать с базой данных...
                        такое ощущение, что данную команду требуется применять, только если хочешь установить все три последующие библиотеки. Так ли, или обязательно?
                        2) У вас создаются сущности City и Address. Правильно ли я понимаю, что они введены только для примера применения на них ролей. А то по ходу текста вначале складывается впечатление, что они часть механизма админки или авторизации. К сожалению, «само собой разумеещеся» у всех разное.

                        Во-вторых, собственно проблемы.
                        3) При настройке Doctrine появилась ошибка:
                        Unrecognized options «SonataUserBundle, FOSUserBundle» under «doctrine.orm.entity_managers.default.mappings.App»
                        При перестройке конфига Симфони благополучно вырезал кусок, который требовался далее. загуглив, получил следующее решение:
                        doctrine:
                        ...
                            orm:
                                auto_generate_proxy_classes: true
                                naming_strategy: doctrine.orm.naming_strategy.underscore
                                auto_mapping: true
                                mappings:
                                    App:
                                        is_bundle: false
                                        type: annotation
                                        dir: '%kernel.project_dir%/src/Entity'
                                        prefix: 'App\Entity'
                                        alias: App
                                    SonataUserBundle: ~
                                    FOSUserBundle: ~
                        
                        что-то связанное с использованием обрезанных и полных конфигов.

                        4) При задании config/packages/security.yaml
                        security:
                            ...
                            acl:
                                connection: default
                        вылетала следующая ошибка: «Unrecognized option „acl“ under „security“». Что решается перемещением параметра acl вне блока security:
                        security:
                            ...
                        acl:
                            connection: default


                        5) Последняя проблема, через которую мне никак не удаётся пробиться.
                        При выполнении завершающей части статьи получаю в итоге: Access Denied. AccessDeniedException in \vendor/symfony/security-http/Firewall/AccessListener.php (line 76).
                        Что связано с тем, что доступ на страницу /admin требует наличия ролей ROLE_, ROLE_ADMIN, ROLE_SONATA_ADMIN (не знаю И или ИЛИ), а у созданного пользователя --super-admin есть только ROLE_SUPER_ADMIN и ROLE_USER.
                        Если прямо в коде, где создаётся карта адресов добавить роль D:/OSPanel/domains/sym2/vendor/symfony/security-http/Firewall/AccessListener.php::__invoke()
                                list($attributes) = $this->map->getPatterns($request);
                                $attributes[] = 'ROLE_SUPER_ADMIN';
                        
                        , то удаётся прошибиться в саму админку (то есть получил доступ). Однако, какие роли/метки там надо дальше добавить пользователю, чтобы можно было убрать эту инъекцию? Взгляд в БД тоже не спасает.
                        Можете разъяснить, как побороть данную проблему?

                        Спасибо
                          0
                          Здравствуйте. Спасибо за замечания. Попробовал по своему же гайду все поставить и столкнулся с описанными проблемами.
                          1. Дополнил текст
                          2. Добавил пояснение что это для примера
                          3. Исправил config, что бы он более соответствовал настройками по-умолчанию. Теперь проблем не будет.
                          4. Просто забыл убрать из security секцию acl. Эта секция и так вынесена в отдельный файл. Так же я еще нашел проблему с командой acl:init, она была у меня init:acl.
                          5. Не получилось воспроизвести. Попробуйте еще раз сначала создать проект и пройти все пункты.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое