Symfony 4.0搭配FOSUser Bundle 2.0无app文件夹问题求助
嘿,这个问题我太熟了——Symfony 4 彻底重构了目录结构,把原来的/app文件夹拆分到/config和/src里了,老教程肯定跟不上!别慌,我一步步给你捋清楚怎么配置FOSUserBundle 2.0:
Symfony 4 用config/bundles.php代替了旧版的app/AppKernel.php,打开这个文件,把FOSUserBundle添加到注册列表里:
return [ // 保留已有的其他Bundle... FOS\UserBundle\FOSUserBundle::class => ['all' => true], ];
旧版的app/config/config.yml对应现在的config/packages/目录下的YAML文件。你需要新建config/packages/fos_user.yaml,然后写入基础配置(根据你的数据库驱动调整):
fos_user: db_driver: orm # 可选值:orm/mongodb/couchdb,按需选择 firewall_name: main user_class: App\Entity\User # 你的User实体类路径 from_email: address: "%env(MAILER_ADDRESS)%" sender_name: "%env(MAILER_SENDER_NAME)%"
原来的app/Entity目录已经移到src/Entity了,在src/Entity下创建User.php,继承FOSUserBundle的基础User类:
<?php namespace App\Entity; use FOS\UserBundle\Model\User 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") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; public function __construct() { parent::__construct(); // 这里可以添加自定义字段的初始化逻辑 } }
安全配置
打开config/packages/security.yaml,更新防火墙和权限控制部分,集成FOSUserBundle的认证逻辑:
security: encoders: FOS\UserBundle\Model\UserInterface: bcrypt role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: ROLE_ADMIN providers: fos_userbundle: id: fos_user.user_provider.username firewalls: main: pattern: ^/ form_login: provider: fos_userbundle csrf_token_generator: security.csrf.token_manager logout: true anonymous: true access_control: - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/, role: ROLE_ADMIN }
路由配置
编辑config/routes.yaml,添加FOSUserBundle的默认路由:
fos_user: resource: "@FOSUserBundle/Resources/config/routing/all.xml"
运行Doctrine命令来创建User对应的数据库表:
# 直接更新Schema(开发环境可用) php bin/console doctrine:schema:update --force # 或者用迁移(生产环境推荐) php bin/console make:migration php bin/console doctrine:migrations:migrate
如果需要修改登录/注册页面的模板,旧版的app/Resources/FOSUserBundle/views路径现在对应templates/bundles/FOSUserBundle,把自定义模板放在这里即可,Symfony会自动识别。
做完这些步骤后,启动服务器php bin/console server:run,访问/login或者/register就能看到FOSUserBundle的默认页面啦!
内容的提问来源于stack exchange,提问作者Václav Stummer

