我使用Symfony标准版并试图让Symfony Finder组件像服务一样,但没有找到它。要使用Finder,我需要手动创建它,如:
$finder = new Symfony\Component\Finder\Finder();
为什么我无法从服务容器中获取它?这是错的吗?
P.S。 Symfony Filesystem组件存在于服务容器中,可通过名称filesystem
获得。
答案 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: false
对 Finder
很重要。它可以防止容器在类之间重用相同的 Finder
对象,否则会导致交叉污染,即在一个类中对实例所做的更改将在其他所有使用它的地方生效。见https://symfony.com/doc/current/service_container/shared.html。