php - Laravel 上的存储库模式

标签 php laravel design-patterns repository-pattern

我想使用 Repository Pattern 但我被语法困住了。我想获取我的函数 index()。

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

enter image description here

在我的文件 AuteurController 中我有这个:

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

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

protected $fillable = ['name', 'firstname'];

我有两个问题:

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

我试过了?

<?php 

namespace App\Repositories; 
use App\Auteur; 

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


?>

我的第二个问题是在我的 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'))
    }
}

最佳答案

1) In my file AuteurRepository how should I create my function index()?

你可以给它起你想要的名字,index(), allRecords(), ...。并执行您需要的查询。

My second question is in my AuteurController I don't understand what to do ?

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

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

在您的 Controller 中,您可以像这样访问 repo 索引函数:

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'))
    }
}

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

在存储库中接受索引方法中的一个参数:

class AuteurRepository
{
    public function index($filters)
    {

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

        return Auteur::orderBy('created_at', $order)
                       ->paginate($pagination);
    }
}

然后在 Controller 中创建要作为参数传递的数组:

    $filters = [
        'pagination' => 5,
        'order' => 'asc',
    ];

    $filters = [
        'pagination' => 10,
        'order' => 'desc',
    ];

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

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

然后将参数传给repo:

    $auteurs = $this->auteurs->index($filters);

希望对您有所帮助;-)

关于php - Laravel 上的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450309/

相关文章:

php - 在某些 PHP 页面上禁用 cookie

php - OOP PHP 查询 mysql 时出错

抽象类特定代码的 C# 模式

javascript - 如何使 javascript 库在 Node js 中工作以进行服务器端操作

php - 如何以编程方式添加属性

laravel - 使用laravel new博客时,“RM”未被识别为内部命令或外部命令

javascript - 从过滤器中成功获取结果后如何在 Laravel 8 中的 Blade 文件中显示

mysql - 在 MySQL 中导入超过 50K 条记录会出现一般错误 : 1390 Prepared statement contains too many placeholders

java - 生产者/消费者模式与观察者模式的区别

javascript - Google 饼图 + PHP + mySQL