Что такое конфигурация службы `file` в Symfony For? - PullRequest
0 голосов
/ 10 февраля 2019

Короткая версия: Что делает конфигурация сервиса Symfony file: SomeFile.php?

Недавно я ввел недопустимое определение сервиса в файл service.yaml во время работы в проекте Symfony.Меня приветствовало это очень полезное сообщение об ошибке

. Не поддерживается определение конфигурации «foo» для определения «App \ Services \ ServiceA» в «/ Users / alanstorm / Sites / symfony-4 / my-».проект / Config / services.yaml».Допустимые ключи конфигурации: «псевдоним», «родитель», «класс», «общий доступ», «синтетический», «ленивый», «открытый», «абстрактный», «не рекомендуется», «фабрика», «файл», «аргументы»."," свойства "," конфигуратор "," вызовы "," теги "," декорации "," имя_прибора_ украшения "," декорация_приложения "," автоматическая настройка "," автоконфигурация "," связывание "в / Users / alanstorm / Sites / symfony-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 пожаловалась

Ожидаемый класс автозагрузчика" App \ SomeFile "быть определенным в файле "/Users/alanstorm/Sites/symfony-4/my-project/vendor/composer/../../src/SomeFile.php".Файл был найден, но класс не был в нем, имя класса или пространство имен, вероятно, содержит опечатку в /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 голосов
/ 10 февраля 2019

Благодаря небольшой помощи от некоторых интернет-друзей , которые смогли откопать старую документацию , теперь я знаю, что конфигурация службы file предназначена для включения PHPнепосредственно перед загрузкой сервиса.

Есть несколько вещей, которые сбили меня с толку.Во-первых, вам нужно использовать параметр %kernel.root_dir%, чтобы это сработало

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

Базовый код контейнера ожидает, что это будет полный путь.

Дополнительным хитрым было следующеесообщение об исключении

Ожидаемый класс автозагрузчика должен быть определен в файле "App \ SomeFile" "/Users/alanstorm/Sites/symfony-4/my-project/vendor/composer/../ ../src/SomeFile.php".

Оказывается, это не имеет никакого отношения к моей конфигурации 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}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...