Php Laravel:我所有模型的依赖注入和静态自定义方法
我创建了一个助手类来搜索和过滤我的laravel模型(方法使用tntsearch和一个自定义范围),目前它工作正常,但我想对其进行一些改进,遗憾的是,很难实现我想要的: 我想改进的是: 1) 能够在我的所有laravel模型上静态调用search方法,如下所示:Php Laravel:我所有模型的依赖注入和静态自定义方法,php,laravel,Php,Laravel,我创建了一个助手类来搜索和过滤我的laravel模型(方法使用tntsearch和一个自定义范围),目前它工作正常,但我想对其进行一些改进,遗憾的是,很难实现我想要的: 我想改进的是: 1) 能够在我的所有laravel模型上静态调用search方法,如下所示: Model::search(); 目前,我必须实例化该类并调用如下方法: $results = $searchHelper->search($request, $filters); 2) 现在我还必须将两个参数传递给构造函数
Model::search();
目前,我必须实例化该类并调用如下方法:
$results = $searchHelper->search($request, $filters);
2) 现在我还必须将两个参数传递给构造函数,在我的类中,我尝试在construct magic方法中进行依赖项注入,但我仍然必须将请求和过滤器作为参数传递
它在我的控制器中的外观:
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;
}
}
如果希望某个方法可用于所有模型,可以使用该方法创建新模型。然后从新模型中扩展您希望搜索可用的每个模型。您可以定义一个
可搜索的特征(而不是搜索
类),如下所示:
Model::search();
trait可搜索
{
公共静态函数搜索($relationships=[]))
{
//您可以使用'resolve'方法解析类实例。
$request=resolve(\light\Http\request::class);
//或者$request=request();
$filters=resolve(\App\filters\QueryFilters::class);
//将模型上的另一个'search'函数重命名为'doSearch',以解决冲突
$results=self::doSearch($request->input('search'),“”)->get();
//或者使用请求助手函数
//$results=self::doSearch(请求('search'),“”)->get();
如果(!$results->isEmpty())
{
$ids=内爆(',',$results->pull('id')->toArray();
$filters->merge(['其中'=>$id]);
}
$results=self::filter($filters)->with($relationships)->分页(10);
返回$results;
}
}
并在您雄辩的模型上执行此可搜索的
合同:
班级预约扩展模型
{
使用可搜索的;
//...
}
现在您可以拨打:
Appointment::search();
什么是QueryFilters
?它来自何处?它是另一个助手类,它接受请求对象并为每个GET参数生成一个查询。它将获得一个“不应静态调用非静态方法…”@lagbox感谢,将函数设置为静态,并将另一个search
函数重命名为doSearch
,以解决冲突。这看起来不错,但我得到了支持“不在对象上下文中使用$this”不要紧,我用self修复了它,谢谢!