
问候大家。 本文将讨论Symfony 4和Sonata Admin。
在安装过程中,我在文档中遇到很多不准确之处,并且文档本身分散在多个地方。 在这里,我将考虑从项目创建到授权以及身份验证的整个过程。
设置的某些部分来自官方文档,某些部分来自GitHub上的注释,其中讨论了安装问题。 还绘制了可能的陷阱和周围的方式。
创建一个symfony项目
$ composer create-project symfony/skeleton sonatademo
$ cd sonatademo
要使用Symfony嵌入式Web服务器,必须安装Symfony客户端 。
我们开始。
$ symfony serve
我们点击链接http://127.0.0.1:8000/ ,我们将收到标准的Symfony问候。 因此,一切正常。

安装Sonata Admin
$ composer require sonata-project/admin-bundle
Sonata管理员和数据库
为了与数据库进行交互,您需要安装以下三个库之一:
在本文中,我将使用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
<?php
我们与数据库同步。
bin/console doctrine:schema:create
Sonata Admin的实体配置
每个实体都有必要创建一个单独的文件,并描述Sonata Admin的工作方式。
<?php
<?php
这些类需要在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
并同时创造了用户群的精髓。
<?php
之后,我们将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
配置原则
# config/packages/doctrine.yaml doctrine: orm: mappings: SonataUserBundle: ~ FOSUserBundle: ~
设置邮件工作
由于在本文的框架内未考虑使用邮件,因此我们将指示存根而不是实际服务。
# config/packages/sonata_user.yaml sonata_user: mailer: fos_user.mailer.noop
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
要正确配置我们的管理类以及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并进入管理部分。

总结
完成所有操作后,我们获得了Symfony 4上Sonata Admin的有效管理部分,以及使用Sonata User + ACL的身份验证和授权。
谢谢大家 如果您有任何问题和意见,我将在评论中倾听。