【问题标题】:Symfony 4.4 Error on FOSUserBundle InstallationFOSUserBundle 安装上的 Symfony 4.4 错误
【发布时间】:2021-01-14 21:09:43
【问题描述】:

我关注了这两个关于“如何在 symfony 4.4 中安装 fosuserbundle”的帖子:

https://vfac.fr/blog/how-install-fosuserbundle-with-symfony-4

https://ourcodeworld.com/articles/read/794/how-to-install-and-configure-fosuserbundle-in-symfony-4

但最后我得到了这个错误:

传递给 FOS\UserBundle\Doctrine\UserManager::__construct() 的参数 3 必须是 Doctrine\Common\Persistence\ObjectManager 的实例,Doctrine\ORM\EntityManager 的实例 给定,在第 1466 行调用 /url/to/symfony/proyect/var/cache/dev/ContainerKx7xY28/srcApp_KernelDevDebugContainer.php

我没有更改 FOSUserBundle 的任何内容,但我的配置似乎有问题...

我的配置文件是这些:

security.yaml

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        #users_in_memory: { memory: null }
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            #anonymous: lazy
            #provider: users_in_memory
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager

            logout:       true
            anonymous:    true

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    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 }

packages/fos_user.yaml

# config/packages/fos_user.yaml
fos_user:
    db_driver: orm # other valid values are 'mongodb' and 'couchdb'
    firewall_name: main
    user_class: App\Entity\User
    from_email:
        address: "email@email.com"
        sender_name: "email@email.com"

src/Entity/User.php

<?php
// src/Entity/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();
        // your own logic
    }
}

编辑:我刚刚尝试了与 symfony 4.3 相同的指南,它成功了!所以我认为是关于 symfony 4.4 和 FOSUserBundle 的兼容性...

【问题讨论】:

  • 请分享更多详细信息,例如您正在使用的 exact 软件包版本,尤其是来自doctrine/*,适用于 Symfony 4.3 的版本和不适用的示例Symfony 4.4。这可能有助于找到不兼容性

标签: symfony fosuserbundle symfony-4.4


【解决方案1】:

这不是与 fos 用户捆绑包有关的问题,而是与您的用户声明有关。

阅读this post first

查看您的用户声明:

<?php
// src/Entity/User.php

namespace App\Entity;

use Doctrine\Common\Persistence\ObjectManager; <---

尝试替换为

use Doctrine\ORM\EntityManagerInterface; <---

您可能在代码中的某个地方使用了一个实体对象,该实体对象是用 ObjectManager 而不是 EntityManagerInterface 声明的。

如果这不起作用,请解释为什么添加此行:

// Añadimos esta linea porque parece que hacer algo...
use Doctrine\Common\Persistence\ObjectManager;

编辑

好的,我一直在寻找它,这看起来像是教义的错误。 我发现了这个问题:https://github.com/doctrine/orm/issues/8242

它解决了你的问题。

只需像这样更新您的 composer.json :

...
"require": {
        "php": ">=7.1.3",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "composer/package-versions-deprecated": "^1.11",
        "doctrine/annotations": "^1.0",
        "doctrine/doctrine-bundle": "^2.1",
        "doctrine/doctrine-migrations-bundle": "^3.0",
        "doctrine/orm": "^2.7",
        "doctrine/common":"^2.13", <------
...

【讨论】:

  • 嗨!对不起,我忘了删除这一行!它没用(在原始帖子中编辑)我在一个新项目中做了所有事情,所以我没有在任何地方使用我的 EntityManager,我仍然在 symfony 4.4 中遇到同样的错误,但是当我在 4.3 中尝试使用相同的配置和相同的实体我没有错误。如果您想查看项目,请查看:github.com/Franrredo/demoTest
  • 好的,Symfony 4.3 不再维护,所以你不应该使用它。所以你想使用 Symfony 4.4,这是正确的,因为它是一个长期版本。但是我可以问一下为什么你不用新版本的 Symfony(比如 5.1)来创建这个?
  • 谢谢4,解决问题!!!!!!顺便说一句,我使用的是 4.4,因为是当前的 lts!当 5.x 获得 lts 时,我将升级项目。
【解决方案2】:

我在互联网上找到了很多找到最佳解决方案的方法,但没有一个能解决我的问题,所以我查看了使用该捆绑包的服务并看到 fos_user.user_manager.default: 服务是调用 Doctrine\Modle\UserManager 的人所以我用我自己的类重写它

fos_user.user_manager.default:
        class: App\Model\UserManager
        arguments:
            - '@fos_user.util.password_updater'
            - '@fos_user.util.canonical_fields_updater'
            - '@doctrine.orm.entity_manager'
            - '%fos_user.model.user.class%'
  1. 创建你自己的类来管理你的fosUser实体,它必须扩展FOS\UserBundle\Model\UserManager(可以复制同一类的代码)
  2. 重写注入相同参数的服务,除第三个参数外,将替换为EntityManagerInterface

希望对你有帮助,对我有用。

【讨论】:

  • 这很好,使用配置作为解决方法是一个完美的解决方案,而不是必须将您的 Doctrine 依赖项锁定到一个过时的版本。
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 2019-01-23
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2019-02-28
  • 1970-01-01
相关资源
最近更新 更多