Class 尝试进行依赖注入时未找到自定义插件块
Class not found for custom plugin block when trying to do dependency injection
我正在尝试在 Drupal 中创建自定义插件块。当尝试实际访问我注册的服务时,我继续收到以下异常:
NOTICE: PHP message: Error: Class 'Drupal\MyNamespace\MyRegisteredService' not found in /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php on line 259 #0 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\Component\DependencyInjection\Container->createService(Array, 'foo....')
我已经正确注册了服务,并正确设置了依赖注入(我相信)它只是访问了不起作用的服务。
我的文件结构目前看起来像:
- web
- modules
- custom
- foo
- foo.services.yml
- src
- MyService.php
- Plugin
- Block
- FooBlock.php
foo.services.yml 看起来像:
services:
foo.my_service:
class: Drupal\MyNamespace\MyRegisteredService
autowire: true
FooBlock.php 看起来像(仅用于依赖注入):
namespace Drupal\foo\Plugin\Block;
use Drupal\MyNamespace\MyRegisteredService
use Drupal\Console\Bootstrap\Drupal;
use Drupal\Core\Block\BlockBase;
use GuzzleHttp\Client;
use Http\Client\Exception;
use phpDocumentor\Reflection\Types\Array_;
use stdClass;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class FooBlock extends BlockBase implements ContainerFactoryPluginInterface {
private $my_service;
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('foo.my_service'),
);
}
function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
Drupal\MyNamespace\MyRegisteredService $my_registered_service,
) {
$this->my_registered_service = $my_registered_service;
}
MyService.php 看起来像:
<?php
namespace Drupal\MyNamespace;
class MyService
{
static function say_hello()
{
return 'hello world';
}
}
我不确定我尝试设置它的方式是否不正确,或者我是否没有正确设置依赖注入。我尝试过但没有成功的一些事情是更改名称空间并从中删除 Drupal\
但这变化不大。
我也试过按照几个指南(例如 this)设置服务,但运气不佳。
如有任何帮助,我们将不胜感激。
我不确定您的服务或命名空间路径的实际名称,但我可以看到您的占位符引用中存在一些不一致之处:
请将 Drupal\MyNamespace\MyRegisteredService
的所有引用更改为 Drupal\foo\MyRegisteredService
,其中 foo
是您的模块的名称。这应该是小写的。
其次,Drupal\MyNamespace\MyRegisteredService
引用了一个 class 名称 MyRegisteredService
,而您给出的示例 class 名称是 MyService
。这些应该是相等的,所以要么选择一个,要么选择另一个。
我正在尝试在 Drupal 中创建自定义插件块。当尝试实际访问我注册的服务时,我继续收到以下异常:
NOTICE: PHP message: Error: Class 'Drupal\MyNamespace\MyRegisteredService' not found in /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php on line 259 #0 /var/www/html/web/core/lib/Drupal/Component/DependencyInjection/Container.php(173): Drupal\Component\DependencyInjection\Container->createService(Array, 'foo....')
我已经正确注册了服务,并正确设置了依赖注入(我相信)它只是访问了不起作用的服务。
我的文件结构目前看起来像:
- web
- modules
- custom
- foo
- foo.services.yml
- src
- MyService.php
- Plugin
- Block
- FooBlock.php
foo.services.yml 看起来像:
services:
foo.my_service:
class: Drupal\MyNamespace\MyRegisteredService
autowire: true
FooBlock.php 看起来像(仅用于依赖注入):
namespace Drupal\foo\Plugin\Block;
use Drupal\MyNamespace\MyRegisteredService
use Drupal\Console\Bootstrap\Drupal;
use Drupal\Core\Block\BlockBase;
use GuzzleHttp\Client;
use Http\Client\Exception;
use phpDocumentor\Reflection\Types\Array_;
use stdClass;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class FooBlock extends BlockBase implements ContainerFactoryPluginInterface {
private $my_service;
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('foo.my_service'),
);
}
function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
Drupal\MyNamespace\MyRegisteredService $my_registered_service,
) {
$this->my_registered_service = $my_registered_service;
}
MyService.php 看起来像:
<?php
namespace Drupal\MyNamespace;
class MyService
{
static function say_hello()
{
return 'hello world';
}
}
我不确定我尝试设置它的方式是否不正确,或者我是否没有正确设置依赖注入。我尝试过但没有成功的一些事情是更改名称空间并从中删除 Drupal\
但这变化不大。
我也试过按照几个指南(例如 this)设置服务,但运气不佳。
如有任何帮助,我们将不胜感激。
我不确定您的服务或命名空间路径的实际名称,但我可以看到您的占位符引用中存在一些不一致之处:
请将
Drupal\MyNamespace\MyRegisteredService
的所有引用更改为Drupal\foo\MyRegisteredService
,其中foo
是您的模块的名称。这应该是小写的。其次,
Drupal\MyNamespace\MyRegisteredService
引用了一个 class 名称MyRegisteredService
,而您给出的示例 class 名称是MyService
。这些应该是相等的,所以要么选择一个,要么选择另一个。