Почему я не могу получить Symfony Finder как сервис?

Я использую Symfony Standard Edition и пытаюсь получить компонент Symfony Finder как сервис, но не нашел его. Чтобы использовать Finder, мне нужно создать его вручную, например:

$finder = new Symfony\Component\Finder\Finder();

Почему я не могу получить его из сервисного контейнера? Это было неправильно?

PS Компонент Symfony Filesystem существует в сервисном контейнере и доступен по имени filesystem,

5 ответов

Решение

Компонент Symfony Finder является автономным компонентом, он не является частью компонента FileSystem:

Службы поиска нет, потому что экземпляр Finder - это объект, которым нужно манипулировать, чтобы он работал. И поскольку объекты всегда передаются по ссылке, если кто-то один раз модифицирует сервис, все увидят эти изменения. Это не то, что вы хотите для этого компонента.

Но вы можете создать свой собственный сервис как экземпляр Finder и использовать этот сервис только в другом сервисе (как зависимость).

Чтобы дополнить ответ Янна Юджона кодом. Вот как вы можете создать свой собственный FinderService из ServiceComponent и внедрить в другие сервисы.

services.yml

    std.symfony_finder:
        class: Symfony\Component\Finder\Finder
        public: false

    std.your_service:
        class: Std\AppBundle\Services\YourService
        arguments: [@std.symfony_finder]

Вы уверены, что это компонент файловой системы?

http://symfony.com/doc/current/components/finder.html

use Symfony\Component\Finder\Finder;

$finder = new Finder();
$finder->files()->in(__DIR__);

foreach ($finder as $file) {
    // Print the absolute path
    print $file->getRealpath()."\n";

    // Print the relative path to the file, omitting the filename
    print $file->getRelativePath()."\n";

    // Print the relative path to the file
    print $file->getRelativePathname()."\n";
}

Вот пример. Вы можете установить его поверх композитора и его

{
    "require": {
        "symfony/finder": "2.3.*"
    }
}

После этого вы можете работать с ним.

В services.yml

 Symfony\Component\Finder\Finder:
     class: Symfony\Component\Finder\Finder

Как сказал Янн Эугоне, у него есть свой пакет: symfony/finder. И обычно он создается напрямую, т. Е. new Finder(). Однако его можно использовать как услугу. Укажите его в конфигурации ваших сервисов, например, config/services.yml:

      Symfony\Component\Finder\Finder:
    shared: false

shared: falseважно с. Это предотвращает повторное использование контейнера Finderобъект между классами, что в противном случае привело бы к перекрестному заражению, т. е. изменения, сделанные экземпляром в одном классе, будут действовать везде, где он еще используется. См. Https://symfony.com/doc/current/service_container/shared.html .

Другие вопросы по тегам