4

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

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

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

P.S. Компонент файловой системы Symfony существует в контейнере обслуживания и доступен по имени filesystem.

ответ

7

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

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

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

+0

+1 очень хорошее объяснение различий между службами (singleton- "stateless") и объектами – DonCallisto

0

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

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.*" 
    } 
} 

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

+0

Нет, я не сказал, что Finder является компонентом Filesystem. Мой вопрос: почему компонент Finder недоступен из сервисного контейнера, такого как компонент файловой системы? –

4

Чтобы дополнить ответ Янна Эугона некоторым кодом. Вот как вы могли бы создать свой собственный 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] 
Смежные вопросы