
Saudações a todos. Este artigo irá falar sobre o Symfony 4 e o Sonata Admin.
Durante o processo de instalação, encontrei muitas imprecisões na documentação e a documentação em si estava espalhada em vários lugares. Aqui vou considerar todo o processo, desde a criação do projeto até a autorização junto com a autenticação.
Algumas partes das configurações foram extraídas da documentação oficial, outras foram extraídas dos comentários no GitHub, onde os problemas de instalação foram discutidos. Possíveis armadilhas e maneiras de contorná-las também são pintadas.
Criando um projeto symfony
$ composer create-project symfony/skeleton sonatademo
$ cd sonatademo
Para usar o Symfony Embedded Web Server, você deve instalar o Symfony Client .
Começamos.
$ symfony serve
Seguimos o link http://127.0.0.1:8000/ e receberemos a saudação padrão do Symfony. Então, tudo funciona corretamente.

Instalar o administrador do Sonata
$ composer require sonata-project/admin-bundle
Sonata Admin and DB
Para interagir com o banco de dados, você precisa instalar uma das três bibliotecas:
Neste artigo, estou usando o SonataDoctrineORMAdminBundle
, que é mais do que suficiente para trabalhar com MySQL
ou Sqlite
.
Instale o SonataDoctrineORMAdminBundle
.
$ composer require sonata-project/doctrine-orm-admin-bundle
Agora vamos configurar o trabalho com o Sqlite
.
Abra o arquivo .env e, na seção ###> doctrine/doctrine-bundle ###
altere DATABASE_URL
.
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
Como o Symfony Flex faz quase todo o trabalho para nós durante a instalação, resta fazer algumas manipulações para obter o resultado final.
# config/packages/framework.yaml framework: translator: { fallbacks: ['en'] }
Realizamos
$ composer dump-env dev
Agora seguimos o link http://127.0.0.1:8000/admin e vemos uma interface administrativa padrão vazia.

Criação de Entidades
Vamos criar duas entidades, por exemplo, conectadas por um relacionamento um para muitos.
<?php
<?php
Sincronizamos com o banco de dados.
bin/console doctrine:schema:create
Configuração de entidade para o administrador do Sonata
É necessário que cada entidade crie um arquivo separado com uma descrição de como o Sonata Admin deve funcionar.
<?php
<?php
Essas classes precisam ser descritas em 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 }
Se ocorrerem erros ao entrar na parte administrativa, por exemplo, Unable to generate a URL for the named route
, você precisará limpar o cache do aplicativo e tentar novamente.
bin/console cache:clear
Agora, se você clicar no link http://127.0.0.1:8000/admin , veremos uma lista de dois elementos Address
e City
, onde é possível visualizar listas e criar novas entidades.

Autorização e autenticação
Primeiro, crie uma entidade de usuário.
<?php
E, ao mesmo tempo, crie a essência do grupo de usuários.
<?php
Depois de configurar o Twig como um mecanismo de modelo.
framework: ... templating: engines: ['twig']
Atualmente, existem problemas com o Symfony Flex e o FOSUserBundle. Para mais detalhes, consulte os links # 2562 , # 2708 e # 2801 .
Embora esses problemas não sejam resolvidos, é necessário fazer algumas manipulações adicionais antes de instalar o 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
Após o qual, você pode instalar o pacote.
$ composer require sonata-project/user-bundle
Configuração da ACL
No Symfony 4, as ACLs foram movidas para um symfony/acl-bundle
separado. Portanto, ele deve ser instalado separadamente.
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
Configurando a Doutrina
# config/packages/doctrine.yaml doctrine: orm: mappings: SonataUserBundle: ~ FOSUserBundle: ~
Configurando trabalho com correio
Como o trabalho com correio não é considerado na estrutura deste artigo, indicaremos um esboço em vez de um serviço real.
# config/packages/sonata_user.yaml sonata_user: mailer: fos_user.mailer.noop
Integração de pacote de usuário no administrador do Sonata
# 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
Agora você pode atualizar a ACL e o banco de dados.
$ bin/console acl:init
$ php bin/console doctrine:schema:update --force
Crie um super usuário. Especifique o nome demo
e a senha 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
Para configurar corretamente nossas classes de administrador, juntamente com a ACL, é necessário fazer alterações nas configurações.
sonata_admin: ... security: handler: sonata.admin.security.handler.acl
Depois de executar o seguinte:
$ 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"]
Agora, quando você tentar acessar o endereço http://127.0.0.1:8000/admin, seremos redirecionados para http://127.0.0.1:8000/admin/login .

Digite demo / demo e entre na parte administrativa.

Sumário
Após todas as manipulações, obtivemos uma parte administrativa do Sonata Admin no Symfony 4, junto com a autenticação e a autorização usando o Sonata User + ACL.
Obrigado a todos. Se você tiver perguntas e comentários, eu os ouvirei nos comentários.