在观看了Laravell演示之后,我想在我自己的应用程序中创建类似于镜头的功能。
我有以下概念:
apply(Request $request, QueryBuilder $qb),允许您修改基于Request的QueryBuilder。目标是将所有Lenses定义为服务,然后以某种方式将它们分配给Resource。这就是我想要解决的问题。
尝试1:将Lenses 直接注入资源
ProjectResource.php
<?php
class ProjectResource
{
protected $lenses = [];
public function __construct(
ProjectRepository $repository,
LensInterface $activeProjectLens,
LensInterface $starredProjectLens
) {
$this->lenses = [
$activeProjectLens,
$starredProjectLens
];
}
public function getLenses() {
return $this->lenses;
}
}这样做的缺点是每个Lens服务都是实例化的,需要手动定义。
尝试2:将标记的Lenses 注入资源
在我的services.yaml中,标记服务并将它们作为参数分配给资源:
App\Lens\ActiveProjectLens:
tags: ['resource.project.lens']
App\Lens\StarredProjectLens:
tags: ['resource.project.lens']
App\Resource\ProjectResource:
arguments:
$lenses: !tagged resource.project.lensProjectResource.php
<?php
class ProjectResource
{
protected $lenses = [];
public function __construct(
ProjectRepository $repository,
iterable $lenses
) {
$this->lenses = $lenses;
}
public function getLenses() {
return $this->lenses;
}
}这种方法的缺点是每个Lens服务和资源都必须被标记,不能是自动配置的服务。
**尝试3:添加编译器传递**
我试图将process()方法添加到Kernel中,但没有取得太大进展。
我的目标是在Resource中定义一个服务列表,并注入它们。有什么既定的模式吗?
发布于 2018-08-22 12:29:48
您使用标记的方法似乎很好。Symfony提供了一种自动向实现特定接口的类添加标记的方法:基于接口的服务配置。
若要使用该功能,您必须执行以下操作:
App\Lens\LensInterface)并让您的透镜类实现接口。services.yaml文件中添加以下配置:services:
// ...
_instanceof:
App\Lens\LensInterface:
tags: ['resource.project.lens']
App\Resource\ProjectResource:
arguments:
$lenses: [!tagged resource.project.lens]
// ...然后,实现LensInterface的每个类都将被注入到ProjectResource中,而不必显式地配置每个透镜。
https://stackoverflow.com/questions/51959966
复制相似问题