Symfony For中的“文件”服务配置是什么?

时间:2019-02-10 01:48:59

标签: php symfony

简短版本:Symfony file: SomeFile.php服务配置有什么作用?

最近在Symfony项目中工作时,我在service.yaml文件中输入了无效的服务定义。这个超级有用的错误消息让我很感动

  

“ / Users / alanstorm / Sites / symfony-4 / my-project / config / services.yaml”中的定义“ App \ Services \ ServiceA”不支持配置密钥“ foo”。允许的配置键是“别名”,“父级”,“类”,“共享”,“合成”,“懒惰”,“公共”,“抽象”,“已弃用”,“工厂”,“文件”,“参数” / Users / alanstorm / Sites / symfony中的“,”属性”,“配置器”,“呼叫”,“标签”,“装饰”,“ decoration_inner_name”,“ decoration_priority”,“ autowire”,“ autoconfigure”,“ bind” -4 / my-project / config / services.yaml(在资源“ /Users/alanstorm/Sites/symfony-4/my-project/config/services.yaml”中加载)。

我认为我以前从未见过Symfony服务的所有有效配置。我正在尝试了解file配置的用途以及如何使用它。

我尝试使用它来配置服务

App\Services\ServiceA:
    file: SomeFile.php

Symfony抱怨

  

警告:include_once(SomeFile.php):无法打开流:没有此类文件或目录

我尝试将名为SomeFile.php的文件放置在`src / SomeFile.php中,而Symfony抱怨

  

自动装带器应在文件“ /Users/alanstorm/Sites/symfony-4/my-project/vendor/composer/../../src/SomeFile.php”中定义“ App \ SomeFile”类。找到了文件,但没有类,文件名或名称空间可能在/Users/alanstorm/Sites/symfony-4/my-project/config/services.yaml中有错字(已加载到资源“ / Users / alanstorm / Sites / symfony-4 / my-project / config / services.yaml“)。

因此,我在App\SomeFile中定义了一个名为src/SomeFile.php的类

#File: src/SomeFile.php
namespace App;
class SomeFile {
}

和Symfony加载了此文件-但是当您抱怨时

  

警告:include_once(SomeFile.php):无法打开流:没有此类文件或目录   在var / cache / dev / ContainerG6s3qUD / getServiceA2Service.php(第11行)中

所以最后,我签出了``文件,看到它包含这一行

#File: var/cache/dev/ContainerG6s3qUD/getServiceA2Service.php
//...
include_once 'SomeFile.php';
//...

因此,我能告诉的是file的配置是作曲家自动加载器的某种替代方案-但我找不到任何有关如何确认怀疑或如何使用它的文档。

任何人都可以帮助我了解此配置字段用于吗?

1 个答案:

答案 0 :(得分:0)

感谢little help from some internet friends能够dig up some old documentation,我现在知道file服务配置用于在加载服务之前立即包含PHP。

有些事情使我绊倒。首先-您需要使用%kernel.root_dir%参数才能使其正常工作

App\Services\ServiceA:
    public: true
    file: "%kernel.root_dir%/foo.php"

基础容器代码希望这是完整路径。

特别棘手的是以下异常消息

  

自动装带器应在文件“ /Users/alanstorm/Sites/symfony-4/my-project/vendor/composer/../../src/SomeFile.php”中定义“ App \ SomeFile”类。

事实证明,这与我的file配置没有任何关系。相反,此错误消息是以下默认service.yaml配置的结果

_defaults:
    autowire: true
    public: true

App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

由于我包含的file位于src中,因此Symfony的resource配置似乎正在尝试将其作为类文件加载。如果不是课程文件,它会抱怨。然后,当file加载程序试图在没有%kernel.root_dir%的情况下加载路径时,事情仍然令人难过。

如果您要同时使用这两种配置模式,则需要确保排除file文件

    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,foo.php}'