Laravel上的存储库模式

use*_*425 4 php design-patterns repository-pattern laravel

我想使用,Repository Pattern但是我在语法上受了限制。我想获取我的函数index()。

第一步,创建文件夹Repositories并创建文件AuteurRepository.php

在此处输入图片说明

在我的文件AuteurController中,我有以下内容:

public function index()
{
   $auteurs = Auteur::oldest()->paginate(5);
   return view('admin.auteurs.index', compact('auteurs'))
           ->with('i', (request()->input('page', 1)-1)*5);
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我只有一个文件Auteur

protected $fillable = ['name', 'firstname'];
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

1)如何在我的文件AuteurRepository中创建函数index()

我试过了吗?

<?php 

namespace App\Repositories; 
use App\Auteur; 

class AuteurRepository
{
    public function index()
    {
        return Auteur::oldest()->paginate(5);
    }
}


?>
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是在我的AuteurController中,我不知道该怎么办?

我现在有这个

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Auteur;
use App\Repositories\AuteurRepository; 

class AuteurController extends Controller
{


    protected $auteurs;

    public function __construct(AuteurRepository $auteurs)
    {
        $this->auteurs = $auteurs; 
    }

    public function index(Request $request)
    {

        return view('admin.auteurs.index', compact('auteurs'))
    }
}
Run Code Online (Sandbox Code Playgroud)

por*_*s Ψ 6

1)如何在我的文件AuteurRepository中创建函数index()?

您可以为它指定所需的名称,index(),allRecords(),...。并执行您需要的查询。

我的第二个问题是在我的AuteurController中,我不知道该怎么办?

如果您的存储库如下所示:

class AuteurRepository
{
    public function index()
    {
        return Auteur::oldest()->paginate(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,您可以像下面这样访问repo index函数:

class AuteurController extends Controller
{


    protected $auteurs;

    public function __construct(AuteurRepository $auteurs)
    {
        $this->auteurs = $auteurs; 
    }

    public function index(Request $request)
    {
        $auteurs = $this->auteurs->index();

        return view('admin.auteurs.index', compact('auteurs'))
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑
此外,您可以自定义一点查询。例如:

在存储库中,在index方法中接受一个参数:

class AuteurRepository
{
    public function index($filters)
    {

        $pagination = $filters['pagination'];
        $order = $filters['order'];

        return Auteur::orderBy('created_at', $order)
                       ->paginate($pagination);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在控制器中创建要作为参数传递的数组:

    $filters = [
        'pagination' => 5,
        'order' => 'asc',
    ];
Run Code Online (Sandbox Code Playgroud)

要么

    $filters = [
        'pagination' => 10,
        'order' => 'desc',
    ];
Run Code Online (Sandbox Code Playgroud)

或者,您可以从请求中获取值(请确保保留默认值,以防请求输入为空)

    $filters = [
        'pagination' => $request->input('pagination')?: 5,
        'order' => $request->input('order')?: 'asc',
    ];
Run Code Online (Sandbox Code Playgroud)

然后将参数传递给仓库:

    $auteurs = $this->auteurs->index($filters);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 ;-)