简短版本: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
的配置是作曲家自动加载器的某种替代方案-但我找不到任何有关如何确认怀疑或如何使用它的文档。
任何人都可以帮助我了解此配置字段用于吗?
答案 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}'