【发布时间】:2019-12-23 02:44:59
【问题描述】:
我创建了一个帮助类来搜索和过滤我的 laravel 模型(方法使用 tntsearch 和自定义范围),目前它可以正常工作,但我想对其进行一些改进,遗憾的是证明很难实现我想要的:
我想改进的地方:
1) 能够在我的所有 laravel 模型上静态调用搜索方法,如下所示:
Model::search();
目前我必须实例化该类并调用如下方法:
$results = $searchHelper->search($request, $filters);
2)现在我还必须将两个参数传递给构造函数,在我的类中,我尝试在构造魔术方法中进行依赖注入,但我仍然必须将请求和过滤器作为参数传递......
它在我的控制器中的外观:
public function search(Request $request, QueryFilters $filters)
{
$search = new Search($request, $filters);
$posts = $search->search('Post', ['postcategory', 'author', 'favorites']);
return response()->json([
'message' => 'Encontramos unas coincidencias',
'posts' => $posts,
], 200);
}
我的助手类:
<?php
namespace App\Helpers;
use Illuminate\Http\Request;
use App\Filters\QueryFilters;
use App\Filters\Filterable;
class Search
{
public $request;
public $filters;
public function __construct(Request $request, QueryFilters $filters)
{
$this->request = $request;
$this->filters = $filters;
}
public function search( $model, $relationships = [] )
{
$model = app("App\Models\".$model.");
$results = $model::search($this->request->input('search'), '')->get();
if(!$results->isEmpty())
{
$ids = implode(',', $results->pluck('id')->toArray());
$filters->merge(['whereIn' => $ids]);
}
$results = $model::filter($this->filters)->with($relationships)->paginate(10);
return $results;
}
}
我想这样调用方法,不向构造函数传递参数(DI 应该处理),静态调用方法
Appointments::search();
【问题讨论】:
-
什么是
QueryFilters?它来自哪里? -
它是另一个辅助类,它接受请求对象并为每个 GET 参数构建一个查询