观看Laravell Nova演示文稿后,我想在自己的应用程序中创建与Lenses类似的功能。
我有以下概念:
{
A: { isAvailable : true} ,
VV: { isAvailable : false} ,
B45: { isAvailable : null}
}
,该方法可让您基于apply(Request $request, QueryBuilder $qb)
来修改QueryBuilder
。目标是将所有Request
定义为服务,然后以某种方式将它们分配给Lenses
。这是我要解决的问题。
尝试1:将Resource
直接注入资源
ProjectResource.php
Lenses
缺点是每个<?php
class ProjectResource
{
protected $lenses = [];
public function __construct(
ProjectRepository $repository,
LensInterface $activeProjectLens,
LensInterface $starredProjectLens
) {
$this->lenses = [
$activeProjectLens,
$starredProjectLens
];
}
public function getLenses() {
return $this->lenses;
}
}
服务都被实例化,需要手动定义
尝试2:将标记为Lens
的标签注入资源
在我的Lenses
标签中,将服务指定为资源的参数:
services.yaml
ProjectResource.php
App\Lens\ActiveProjectLens:
tags: ['resource.project.lens']
App\Lens\StarredProjectLens:
tags: ['resource.project.lens']
App\Resource\ProjectResource:
arguments:
$lenses: !tagged resource.project.lens
这种方法的缺点是每个<?php
class ProjectResource
{
protected $lenses = [];
public function __construct(
ProjectRepository $repository,
iterable $lenses
) {
$this->lenses = $lenses;
}
public function getLenses() {
return $this->lenses;
}
}
服务都必须标记资源,并且资源不能是自动配置的服务。
**尝试3:添加编译器密码**
我试图将Lens
方法添加到process()
中,但是我对此并没有太过了解。
我的目标是在Kernel
中定义服务列表,并注入它们。有没有确定的模式?
答案 0 :(得分:2)
您使用标记的方法似乎不错。 Symfony提供了一种将标签自动添加到实现特定接口的类的方法:Interface-based service configuration。
要使用该功能,您必须执行以下操作:
protected $table = 'admin';
),然后让镜头类实现该接口。App\Lens\LensInterface
文件中,添加以下配置:services.yaml
然后,每个实现LensInterface的类都将注入到ProjectResource中,而不必显式配置每个镜头。