服务注入仅在同一类的某些函数上失败



从symfony 3移到4,我开始根据这个注入服务。

在大多数函数中;"助手";服务它工作得很好,但由于某种原因,它在其中一些方面失败了,我不知道我做了什么不同。。。错误如下:

无法解析的参数$helper"App\Controller\Poslog\OperatorController::historyindividualalation((",也许您忘记将控制器注册为服务,或者错过了用";controller.service_arguments";?

如果函数完全省略了内容,因为它们包含什么并不重要,我可以在HistoryIndividualAction((中注释掉整个代码,但仍然会得到完全相同的错误消息。

下面的OperatorController::newAction((工作得很好(以及同一对象中的许多其他函数(,而OperatorControler::HistoryIndividualAction((则失败。

use AppServiceglobalHelper as globalHelper;
...
class OperatorController extends AbstractController
{
public function newAction(Request $request, ACRGroup $ACRGroup = null, globalHelper $helper)
{
...
}
public function HistoryIndividualAction($operatorId, globalHelper $helper)
{
...
}
}

路由看起来像这个

operator_new:
path:     /new/{ACRGroup}
defaults: { _controller: AppControllerPoslogOperatorController::newAction, ACRGroup: null }
methods:  [GET, POST]
operator_history_individual:
path:     /history/individual/{operatorId}
defaults: { _controller: AppControllerPoslogOperatorController::historyIndividualAction }
methods:  GET

服务.yml

# This file is the entry point to configure your own services.
# Files in the packages/ subdirectory configure your dependencies.
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
locale: en

services:
# default configuration for services in *this* file
_defaults:
autowire: true      # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
# controllers are imported separately to make sure services can be injected
# as action arguments even if you don't extend any base controller class
AppController:
resource: '../src/Controller/'
tags: ['controller.service_arguments']

# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
globalHelper:
class: AppServiceglobalHelper
public: false
arguments: ['@service_container', '@doctrine.orm.entity_manager']

GlobalHelper的开头是这样的:

namespace AppService;
use SymfonyComponentDependencyInjectionContainerInterface as Container;
//use DoctrineORMEntityManager as EntityManager; //gave deprecation notice, profiler suggested to change to below and the deprecation notice disappeared.
use DoctrineORMEntityManagerInterface as EntityManager;

class globalHelper {
private $container;
private $em;
public function __construct(Container $container, EntityManager $em) {
$this->container = $container;
$this->em = $em;
}

基本问题是方法名称区分大小写,并且不匹配。

// Change
public function HistoryIndividualAction(
// To
public function historyIndividualAction(

通常我会称之为打字错误,然后继续前进,但这个错误很有趣。我本以为会有unknown method类型的消息,但Symfony会处理好的。错误来自于试图处理方法的参数。

Symfony注入动作参数的能力背后有一个巨大的子系统。并不像看上去那么简单,它涉及到使用方法名称缓存有关操作签名的信息。这就是案例不匹配变得显著的地方。

因此,我认为,对于可能遇到类似错误消息的开发人员来说,保留这个答案可能是值得的。

尝试在控制器操作中对参数进行不同的排序。

public function newAction(Request $request, ACRGroup, globalHelper $helper, $ACRGroup = null) {
// ...
}

并尝试清除缓存:

php bin/console cache:clear

最新更新