在观看了 Laravel Nova 演示后,我想在我自己的应用程序中创建与 Lenses 类似的功能。
我有以下概念:
- 实体:标准主义实体
- 资源:描述资源的类,包括目标实体和可用镜头。
- Lens:有一个方法
apply(Request $request, QueryBuilder $qb)
可以让你修改QueryBuilder
基于Request
.
目标是将所有内容定义Lenses
为服务,然后以某种方式将它们分配给Resource
. 这是我试图解决的问题。
尝试1:直接注入Lenses
资源
项目资源.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.lens
项目资源.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
并将它们注入。这有什么既定的模式吗?