noitran/micro-repositories

laravel / lumen 项目的仓库包

v0.1.0 2019-02-13 20:32 UTC

This package is auto-updated.

Last update: 2024-09-29 05:08:46 UTC


README

Coverage Status Quality Score Software License Latest Version Total Downloads

关于

  • 该包为laravel和lumen应用添加了对仓库设计模式的支持。这个包是从零开始创建的,因为其他版本的仓库模式包没有得到维护或者质量较差。欢迎贡献!

安装

  • 作为composer包安装
$ composer require noitran/micro-repositories

Laravel

  • Laravel使用提供者自动发现。可以使用命令发布配置文件
$ artisan vendor:publish --provider="Noitran\Repositories\ServiceProvider"

Lumen

  • 打开您的bootstrap/app.php文件,将其注册为服务提供者
$app->register(Noitran\Repositories\ServiceProvider::class);
  • 配置文件应在bootstrap/app.php中手动加载
$app->configure('repositories');

仓库

创建Eloquent模型

  • 创建Eloquent模型,就像您最初做的那样。使用laravel生成器或手动创建。以下是我将使用的示例模型
<?php

namespace App\Data\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class User extends Model
{
    /**
     * The attributes that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = [
        'id',
    ];
}

创建Eloquent仓库实现和仓库接口

  • 首先,让我们创建我们的仓库接口
<?php

namespace App\Data\Repositories\User;

use Noitran\Repositories\Contracts\Repository\RepositoryInterface;

/**
 * Interface UserRepository
 */
interface UserRepository extends RepositoryInterface
{
    //
}
  • 第二步是创建仓库接口的实现。我们将扩展SqlRepository,它添加了对使用表名查询的支持。如果您使用jenssegers/laravel-mongodb包,则您的仓库实现应扩展MongoRepository
<?php

namespace App\Data\Repositories\User;

use Noitran\Repositories\Repositories\SqlRepository;
use App\Data\Models\User;

/**
 * Class UserRepositoryEloquent
 */
class UserRepositoryEloquent extends SqlRepository implements UserRepository
{
    /**
     * Specify Model class name.
     *
     * @return string
     */
    public function getModelClassName(): string
    {
        return User::class;
    }

    /**
     * Boot up the repository, pushing criteria.
     */
    public function boot(): void
    {
        //
    }
}
  • 在创建好仓库和接口后,它们应通过laravel IoC绑定来加载。最快的方法是将绑定添加到App\Providers\AppServiceProvider类中。
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Data\Repositories\User\UserRepository;
use App\Data\Repositories\User\UserRepositoryEloquent;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register(): void
    {
        $this->app->bind(UserRepository::class, UserRepositoryEloquent::class);
    }
}

过滤器

  • 过滤器位于仓库之上,并使用标准来启用查询过滤功能,包括内置和/或自定义标准。

  • 创建过滤器类很简单。示例

<?php

namespace App\Data\Filters\User;

use Noitran\Repositories\Filters\AbstractFilter;
use App\Data\Repositories\User\UserRepository;

class UserFilter extends AbstractFilter
{
    /**
     * @var array
     */
    protected $queryFilters = [
        // List of custom Criteria filters 
    ];

    /**
     * UserFilter constructor.
     *
     * @param UserRepository $userRepository
     */
    public function __construct(UserRepository $userRepository)
    {
        parent::__construct();

        $this->setRepository($userRepository)
            ->setQueryFilters($this->queryFilters);
    }

    /**
     * @param array $requestAttributes
     *
     * @return mixed
     */
    public function filter(array $requestAttributes)
    {
        $input = $this->getInput(
            $this->queryFilters,
            $requestAttributes
        );

        $this->repository = $this->pushFilters($this->repository, $input);

        return $this;
    }
}
  • 创建完UserFilter后,您现在可以使用内置的过滤标准并添加自定义标准。过滤器作为HTTP请求和仓库之间的层,让您能够使用RQL(请求查询语言)、排序、分页等功能。

标准

@todo