Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 4.1组件-依赖项注入问题_Php_Symfony_Dependency Injection - Fatal编程技术网

Php Symfony 4.1组件-依赖项注入问题

Php Symfony 4.1组件-依赖项注入问题,php,symfony,dependency-injection,Php,Symfony,Dependency Injection,我正在用PHP重构旧的应用程序 我试图使用Symphony依赖注入组件将服务注入控制器(或其他服务),但我不知道如何实现这一点,因为Symphony文档比框架组件更适合使用框架 我已经有了自己的内核,包含所有服务和控制器的容器(控制器已经注册为服务)。我的控制器从symfony/frameworkbundle扩展AbstractController。所以我现在唯一能做的就是: 通过$this->container->Get('service\u id')从容器中获取服务,但构造函数中的服务是否将

我正在用PHP重构旧的应用程序

我试图使用Symphony依赖注入组件将服务注入控制器(或其他服务),但我不知道如何实现这一点,因为Symphony文档比框架组件更适合使用框架

我已经有了自己的内核,包含所有服务和控制器的容器(控制器已经注册为服务)。我的控制器从
symfony/frameworkbundle
扩展AbstractController。所以我现在唯一能做的就是:

通过
$this->container->Get('service\u id')
从容器中获取服务,但构造函数中的服务是否将类作为参数

public function __constructor(SomeClass $someClass)
然后我得到一个例外:

编译容器时,“App\V2\Service\TestService”服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖项注入

如果我更改配置以公开所有服务,则:

函数APP\V2\Service\TestService::\uu construct()的参数太少,传递了0个,预期正好是1个

我准备了一个要点,以便更好地了解我所说的内容:

有人能帮助我使用Symfony组件(不是Symfony框架)实现DI吗?好的工作示例就足够了。或者请把你的话放在我的要点上,我试着解决这个问题。

您需要更改服务的默认配置以使其公开:

services:
    _defaults:
        public: true
但更优雅的访问服务的方法是将它们注入控制器操作:

public function myAction(Request $request, TestService $service)
Symfony 4/5自动接线方式 根据你的问题和评论,我认为你所需要做的就是修复自动布线

Symfony 4路操作简单:自动连接所有服务和参数,无需手动设置(如果可能)

要将其应用到您的示例中,这将是适合您的需要和Symfony 4的最佳配置:

services:
    _defaults:
        # pass service dependencies to constructors by default
        autowire: true

        # add known tags (for commands, event subscribers etc) by default
        autoconfigure: true
        
        # to make using tests, bin files and another simpler
        public: true

        # autowiring of string/array/int parameters to constructors
        # this fixes cases like "argument "$facebookUserId" of method "__construct()" has no type-hint, you should configure its value explicitly"
        bind:
            # $constructorVariableName: %parameter% in config
            $facebookUserId: '%facebook_user_id%'

    APP\V2\:
        resource: '../src/app/V2/*'
        exclude: '../src/app/V2/{Script, Trait}'

    # symfony services - you still have to setup 3rd paryt services manually
    Symfony\Component\DependencyInjection\ParameterBag\ContainerBag:
        arguments:
            - '@service_container'
    # ...

在哪里继续阅读

  • APP\V2\Service\T estService
    看起来怎么样?你在哪里注册它?另外,你可以像这样简化配置:@TomášVotruba我没有注册服务,它应该自动注册,因为
    autowire:true
    。我更新了gist,所以您可以检查TestService.php的外观。好的,我做了一些更改,就像您在gist中做的一样(ControllerResolver和ArgumentResolver现在应该是公共的,否则我不能在框架类中使用它们)。现在看起来好多了,但我还有另外一个问题:1。如果在defaults
    public:true
    中进行服务内配置,则无法自动连接具有构造函数内标量类型参数(字符串、int、数组)的服务<代码>无法自动连线服务“APP\V2\service\API”:方法“\uu construct()”的参数“$facebookUserId”没有类型提示,您应该显式配置其值。2如果
    public:false
    -
    控制器“APP\V2\Controller\API\SocialNetworkController::loginAction()”要求您为“$testService”提供一个值论点要么该参数可为null且未提供null值,要么未提供默认值,要么是因为该参数后面有一个非可选参数。
    因此,看起来服务仍然没有注入。