Kayue\WordpressBundle 使用 Symfony 4.4.1:class XXX 在链配置的命名空间中找不到 App\Entity

Kayue\WordpressBundle with Symfony 4.4.1: The class XXX was not found in the chain configured namespaces App\Entity

我正在尝试在我的 Symfony 4.4.1 项目中使用 kayue/KayueWordpressBundle 作为 composer require kayue/kayue-wordpress-bundle 安装作曲家,但我无法做到。

这就是我想要做的:

<?php

namespace App\Service\WordPress;

use Doctrine\ORM\EntityManagerInterface;
use Kayue\WordpressBundle\Entity\Post;

class PostCollection
{
    protected $postRepository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->postRepository = $entityManager->getRepository(Post::class);
    }
}

我得到的错误:

The class 'Kayue\WordpressBundle\Entity\Post' was not found in the chain configured namespaces App\Entity

At first I blamed my dual-database configuration(Symfony 与 Wordpress 在不同的数据库上)但后来我将数据库放在一起,问题仍然存在:

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'

        # Only needed for MySQL (ignored otherwise)
        charset: utf8mb4
        default_table_options:
            collate: utf8mb4_unicode_ci
    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

过去 2 小时我一直在摆弄,但现在我完全没有想法了。我想知道是否有人真的让这个与 Symfony 4 一起工作。

谢谢!

编辑:其他尝试:

直接post注入:

use Kayue\WordpressBundle\Entity\Post;
public function index(Post $post){}

结果:

无法自动装配 "App\Controller\IndexController::index()" 的参数 $post:它引用 class "Kayue\WordpressBundle\Entity\Post" 但不存在此类服务。

根据文档:过时的 Symfony 2 方式

$repo = $this->get('kayue_wordpress')->getManager()->getRepository('KayueWordpressBundle:Post');

结果:

未找到服务 "kayue_wordpress":即使它存在于应用程序的容器中,"App\Controller\IndexController" 中的容器是一个较小的服务定位器,它只知道 "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer"、"session" 和 "twig" 服务。尝试改用依赖注入。

执行此操作的 "best way" 实际上是:

    public function index(EntityManagerInterface $entityManager)
    {
$entityManager->getRepository('KayueWordpressBundle:Post');
}

结果:

在链配置的命名空间中找不到 class'Kayue\WordpressBundle\Entity\Post'App\Entity

我的同事找到了解决方案。您必须像这样配置自动装配:

// config/packages/kayue_wordpress.yaml

services:
  Kayue\WordpressBundle\Wordpress\ManagerRegistry: '@kayue_wordpress'

之后,您可以自动装配:

use Kayue\WordpressBundle\Wordpress\ManagerRegistry;

    public function __construct(ManagerRegistry $wpManagerRegistry)
    {
        $this->wpPostRepository = $wpManagerRegistry->getManager()->getRepository('KayueWordpressBundle:Post');
    }

public function getPosts()
{
$post = $this->wpPostRepository->findOneBy(array(
        'slug'   => 'hello-world',
        'type'   => 'post',
        'status' => 'publish',
    ));
}

虽然您找到了解决方案,但我想解释一连串的问题。

错误

The class 'Kayue\WordpressBundle\Entity\Post' was not found in the chain configured namespaces App\Entity

表示在提供的实体管理器中,其配置定义在:

orm:
    ...
    mappings:
        App:
        ...
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App

未找到实体类型 Kayue\WordpressBundle\Entity\Post

通常此类错误的解决方法是:

  • 在实体管理器中包含路径 Kayue\WordpressBundle\Entity
  • 使用另一个包含此路径的实体管理器

在你的例子中,默认实体管理器是自动连接的,基于Doctrine\ORM\EntityManagerInterface的服务别名,如here. The alias is defined in the doctrine bundle `s config 指向默认的学说实体管理器。

您想使用Kayue\WordpressBundle的实体管理器,而不是默认的

解决方案

要解决这个问题你可以

1) Bind Arguments By type,如您所见,为服务 [ 创建别名 Kayue\WordpressBundle\Wordpress\ManagerRegistrykayue_wordpress,如:

services:
      # pass this service for any ManagerRegistry type-hint for any
      # service that's defined in this file
      Kayue\WordpressBundle\Wordpress\ManagerRegistry: '@kayue_wordpress'

2) 使用 Binding Arguments by Name,在本例中为“$wpManagerRegistry”,如:

services:
# default configuration for services in *this* file
    _defaults:
        ...
        bind:
            $wpManagerRegistry: '@kayue_wordpress'

然后

public function index($wpManagerRegistry)
{

    $postRepository = $wpManagerRegistry->getManager()->getRepository('KayueWordpressBundle:Post');

因此任何名称为“$wpManagerRegistry”的参数都自动连接到此服务。

参考资料

The Symfony 3.3 DI Container Changes Explained (autowiring, _defaults, etc)