Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:我所有模型的依赖注入和静态自定义方法_Php_Laravel - Fatal编程技术网

Php Laravel:我所有模型的依赖注入和静态自定义方法

Php Laravel:我所有模型的依赖注入和静态自定义方法,php,laravel,Php,Laravel,我创建了一个助手类来搜索和过滤我的laravel模型(方法使用tntsearch和一个自定义范围),目前它工作正常,但我想对其进行一些改进,遗憾的是,很难实现我想要的: 我想改进的是: 1) 能够在我的所有laravel模型上静态调用search方法,如下所示: Model::search(); 目前,我必须实例化该类并调用如下方法: $results = $searchHelper->search($request, $filters); 2) 现在我还必须将两个参数传递给构造函数

我创建了一个助手类来搜索和过滤我的laravel模型(方法使用tntsearch和一个自定义范围),目前它工作正常,但我想对其进行一些改进,遗憾的是,很难实现我想要的:

我想改进的是:

1) 能够在我的所有laravel模型上静态调用search方法,如下所示:

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修复了它,谢谢!