7

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

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

为什么我无法从服务容器中获取它?是不是错了?

PS Symfony 文件系统组件存在于服务容器中并且可以通过名称获得filesystem

4

5 回答 5

14

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

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

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

于 2014-09-24T13:12:58.267 回答
5

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

服务.yml

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

    std.your_service:
        class: Std\AppBundle\Services\YourService
        arguments: [@std.symfony_finder]
于 2015-10-23T09:53:52.567 回答
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.*"
    }
}

之后,您可以使用它。

于 2014-09-24T12:28:18.537 回答
0

进入 services.yml

 Symfony\Component\Finder\Finder:
     class: Symfony\Component\Finder\Finder
于 2020-02-28T15:26:38.787 回答
0

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

Symfony\Component\Finder\Finder:
    shared: false

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

于 2021-08-10T21:09:45.703 回答