gpt4 book ai didi

symfony4 - 交响乐 4 : Using Factories of a Service to instantiate multiple objects

转载 作者:行者123 更新时间:2023-12-02 00:51:33 25 4
gpt4 key购买 nike

我有一个代表常规路径的类路径,可以用它做一些神奇的事情。每当我想在我的应用程序中处理路径时,我都想快速实例化一个 Path 对象并继续使用它。 Path 类有一些依赖项,我想使用 Autowiring /依赖项注入(inject)。

我尝试过的:

我将该类设置为服务并创建了一个工厂方法,类似于此处描述的内容:https://symfony.com/doc/current/service_container/factories.html .工厂方法接收依赖项作为参数并将它们存储在私有(private)属性中。只要在需要实例的地方使用依赖注入(inject),我就能够获得新实例。这里的依赖没有问题。现在的问题是我只能使用依赖注入(inject)获得一个实例。是的,我可以在上面克隆一个“普通”对象,但我想有更好的解决方案。手动调用工厂方法是行不通的,因为其中存在依赖注入(inject)。

服务和 Controller :

<?
// Service
namespace App\Service;

class Path {
private $dep;

public function __construct(DependencyName $dep) {
$this->dep = $dep;
}

public static function factory(DependencyName $dep) {
$path = new Path($dep);
return $path;
}

// some methods
}

// Controller
namespace App\Controller;

use App\Service\Path;

class SomeController {
public function generatePaths() {
for (int i = 0; i < 10; i++) {
$paths[] = Path::factory(/* missing dependencies */);
}
}

public function __construct(Path $path) {
// here I can have one Path without a problem
// but I need more than one
}
}

在 services.yaml 中:

App\Service\Path:
# call the static method
factory: ['App\Service\Path', 'factory']

更一般化:当我使用 Autowiring 时,如何创建具有依赖性的服务的多个实例?解决方案不应仅限于 Controller 。我也需要在其他服务中使用此服务。

最佳答案

您可以使用 shared服务定义中的选项:

In the service container, all services are shared by default. This means that [...] you'll get the same instance. In some cases, you might want to always get a new instance.

通过这样做(据我所知,您的 Dependency 始终相同)您将不再需要 factory 方法,并且可以将定义更改为:

App\Service\Path:
class: App\Service\Path
shared: false

要拥有多个实例,您不能使用注入(inject),因此您需要实现 ServiceSubscriberInterface并注册您的服务,以便您可以在每次需要时从容器中手动检索它,同时仍然利用 Autowiring 。

我不会详细介绍,因为有多个选项,其中一个可能比其他选项更有意义,但一旦实现,请执行以下操作:

$path = $this->get('path_builder'); // Whatever your alias is

每次都会给你一个新实例。

关于symfony4 - 交响乐 4 : Using Factories of a Service to instantiate multiple objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com