我使用 Symfony 标准版并尝试像服务一样获取 Symfony Finder 组件,但没有找到它。要使用 Finder,我需要手动创建它,例如:
$finder = new Symfony\Component\Finder\Finder();
为什么我无法从服务容器中获取它?是不是错了?
PS Symfony 文件系统组件存在于服务容器中并且可以通过名称获得filesystem
。
我使用 Symfony 标准版并尝试像服务一样获取 Symfony Finder 组件,但没有找到它。要使用 Finder,我需要手动创建它,例如:
$finder = new Symfony\Component\Finder\Finder();
为什么我无法从服务容器中获取它?是不是错了?
PS Symfony 文件系统组件存在于服务容器中并且可以通过名称获得filesystem
。
Symfony 的 Finder 组件是一个独立的组件,它不是 FileSystem 组件的一部分:
没有“finder”服务,因为 Finder 实例是一个需要操作才能工作的对象。并且由于对象总是通过引用传递,如果有人修改了一次服务,每个人都会看到这些变化。这不是您想要的组件。
但是您可以创建自己的服务作为 Finder 实例,并仅在另一个服务中使用此服务(作为依赖项)。
用一些代码补充 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]
你确定它是文件系统组件吗?
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
正如 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。