Почему я не могу получить Symfony Finder как сервис?
Я использую Symfony Standard Edition и пытаюсь получить компонент Symfony Finder как сервис, но не нашел его. Чтобы использовать Finder, мне нужно создать его вручную, например:
$finder = new Symfony\Component\Finder\Finder();
Почему я не могу получить его из сервисного контейнера? Это было неправильно?
PS Компонент Symfony Filesystem существует в сервисном контейнере и доступен по имени filesystem
,
5 ответов
Компонент Symfony Finder является автономным компонентом, он не является частью компонента FileSystem:
- http://symfony.com/doc/current/components/finder.html
- http://symfony.com/doc/current/components/filesystem.html
Службы поиска нет, потому что экземпляр 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 .