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)
我正在尝试在我的 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)