为什么我不能让Symfony Finder像服务一样?

时间:2014-09-24 12:23:11

标签: php symfony symfony-components symfony-filesystem symfony-finder

我使用Symfony标准版并试图让Symfony Finder组件像服务一样,但没有找到它。要使用Finder,我需要手动创建它,如:

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

为什么我无法从服务容器中获取它?这是错的吗?

P.S。 Symfony Filesystem组件存在于服务容器中,可通过名称filesystem获得。

5 个答案:

答案 0 :(得分:7)

Symfony的Finder组件是一个独立的组件,它不是FileSystem组件的一部分:

没有"发现者"服务,因为Finder实例是需要操作才能工作的对象。由于对象总是通过引用传递,如果有人修改了一次服务,每个人都会看到这些更改。这不是您想要的此组件。

但您可以将自己的服务创建为Finder实例,并仅在其他服务中使用此服务(作为依赖项)。

答案 1 :(得分:4)

用一些代码补充Yann Eugone的答案。这是您可以从ServiceComponent创建自己的FinderService并注入其他服务的方法。

services.yml

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

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

答案 2 :(得分: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";
}

这是一个例子。您可以将它安装在composer及其

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

之后你可以使用它。

答案 3 :(得分:0)

进入services.yml

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

答案 4 :(得分:0)

正如 Yann Eugoné 所说,Finder 有自己的包:symfony/finder。并且它通常只是直接实例化,即new Finder()。但是,它可以用作服务。在您的服务配置中指定它,例如 config/services.yml:

Symfony\Component\Finder\Finder:
    shared: false

shared: falseFinder 很重要。它可以防止容器在类之间重用相同的 Finder 对象,否则会导致交叉污染,即在一个类中对实例所做的更改将在其他所有使用它的地方生效。见https://symfony.com/doc/current/service_container/shared.html