tehekone/laravel-resources

0.5.1 2020-04-14 08:28 UTC

This package is auto-updated.

Last update: 2024-09-14 17:53:44 UTC


README

Laravel 资源

Latest Stable Version License Total Downloads

目录

点击展开

##简介

##安装

您可以通过 composer 安装此包

composer require tehekone/laravel-resources

或者,将这些两行添加到您的 composer require 部分

{
    "require": {
        "tehekone/laravel-resources": "^0.3"
    }
}

##用法

...

###定义资源

...

###定义过滤器

####选择过滤器

php artisan shine:filter UserType --select

每个选择过滤器包含两个方法: applyoptionsapply 方法负责修改查询以实现所需的过滤器状态,而 options 方法定义了过滤器可能有的 "值"。让我们看看一个 UserType 过滤器的例子

<?php

namespace App\Filters;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use TehekOne\Laravel\Resources\Filters\Templates\SelectFilter;

/**
 * Class UserType
 *
 * @package App\Filters
 */
class UserType extends SelectFilter
{
    /**
     * Apply the filter to the given query.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param mixed $value
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Builder $query, $value)
    {
        return $query->where('type', $value);
    }

    /**
     * Get the filter's available options.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function options(Request $request)
    {
        return [
            'admin' => 'Administrator', 
            'editor' => 'Editor', 
        ];
    }
}

options 方法应该返回一个键值对的数组。数组的值将被传递到 apply 方法中作为 $value 参数。此过滤器定义了两个可能的值:admineditor

如上例所示,您可以利用传入的 $value 来修改您的查询。apply 方法应该返回修改后的查询实例。

####布尔过滤器

您可以使用 shine:filter --boolean Artisan 命令生成布尔过滤器。

php artisan shine:filter UserType --select

每个布尔过滤器包含两个方法:applyoptionsapply 方法负责修改查询以实现所需的过滤器状态,而 options 方法定义了过滤器可能有的 "值"。

在构建布尔过滤器时,传递给 apply 方法的 $value 参数是一个包含每个过滤器选项布尔值的关联数组。

让我们看看一个 UserType 过滤器的例子

<?php

namespace App\Filters;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use TehekOne\Laravel\Resources\Filters\Templates\BooleanFilter;

/**
 * Class UserType
 *
 * @package App\Filters
 */
class UserType extends BooleanFilter
{
    /**
     * Apply the filter to the given query.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param mixed $value
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Builder $query, $value)
    {
        return $query->where('is_admin', $value['admin'])
                     ->where('is_editor', $value['editor']);
    }

    /**
     * Get the filter's available options.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function options(Request $request)
    {
        return [
            'admin' => 'Administrator', 
            'editor' => 'Editor', 
        ];
    }
}

options 方法应该返回一个键值对的数组。数组的值将被传递到 apply 方法中作为 $value 参数。此过滤器定义了两个可能的值:admineditor

如上例所示,您可以利用传入的 $value 来修改您的查询。apply 方法应该返回修改后的查询实例。

####日期过滤器

您可以使用 shine:filter --date Artisan 命令生成日期过滤器。

php artisan shine:filter CreatedFilter --date

每个日期过滤器包含一个方法:applyapply 方法负责修改查询以实现所需的过滤器状态。

在构建日期过滤器时,传递给 apply 方法的 $value 参数是所选日期的字符串表示。

让我们看看一个 CreatedFilter 过滤器的例子

<?php

namespace App\Filters;

use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Builder;
use TehekOne\Laravel\Resources\Filters\Templates\DateFilter;

/**
 * Class CreatedFilter
 *
 * @package App\Filters
 */
class CreatedFilter extends DateFilter
{
    /**
     * Apply the filter to the given query.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param mixed $value
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Builder $query, $value)
    {
        return $query->where('created_at', '<=', Carbon::parse($value));
    }
}

如上例所示,您可以利用传入的 $value 来修改您的查询。apply 方法应该返回修改后的查询实例。

####过滤器标题

如果您想更改过滤器标题,您可以在过滤器类上定义一个 name 属性

/**
 * The displayable name of the filter.
 *
 * @var string
 */
public $name = 'Filter Title';

如果您的过滤器名称需要动态生成,您应该在过滤器类上创建一个 name 方法

/**
 * Get the displayable name of the filter.
 *
 * @return string
 */
public function name()
{
    return 'Filter By ' . $this->custom;
}

####动态过滤器

有时您可能想创建一个动态过滤器,该过滤器根据不同的列进行筛选。除了在构造函数中传递我们想要筛选的列名之外,我们还需要重写 key 方法。

让我们看看一个 TimestampFilter 过滤器的例子

<?php

namespace App\Filters;

use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Builder;
use TehekOne\Laravel\Resources\Filters\Templates\DateFilter;

/**
 * Class TimestampFilter
 *
 * @package App\Filters
 */
class TimestampFilter extends DateFilter
{
    /**
     * The column that should be filtered on.
     *
     * @var string
     */
    protected $column;

    /**
     * Create a new filter instance.
     *
     * @param string $column
     * @return void
     */
    public function __construct($column)
    {
        $this->column = $column;
    }

    /**
     * Apply the filter to the given query.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @param mixed $value
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function apply(Builder $query, $value)
    {
        return $query->where($this->column, '<=', Carbon::parse($value));
    }

    /**
     * Get the key for the filter.
     *
     * @return string
     */
    public function key()
    {
        return 'timestamp_'.$this->column;
    }
}

在向资源注册过滤器时,传递您想要筛选的列名

/**
 * Get the filters available for the resource.
 *
 * @param Request $request
 *
 * @return array
 */
public function filters(Request $request)
{
    return [
        new \App\Filters\TimestampFilter('created_at'),
        new \App\Filters\TimestampFilter('updated_at'),
    ];
}

####渲染过滤器

默认情况下,资源中定义的所有过滤器都按行渲染。让我们看看一个例子

@foreach ($resource->filters->items as $name => $filter)
    {!! $filter->render() !!}
@endforeach

{{-- Or simple --}}

@foreach ($resource->filters->items as $name => $filter)
    {!! $filter !!}
@endforeach

但您可能还想通过 key 过滤并单独渲染。以下是一个使用 UserType 过滤器的例子,让我们通过这个例子来了解它是如何工作的。

{!! $resource->filters->get('user_type')->render() !!}

{{-- Or simple --}}

{!! $resource->filters->get('user_type') !!}

要获取所有选中的过滤器,您可以使用 selected 方法并简单地使用 count。让我们看看一个例子。

$resource->filters->selected($request);
$resource->filters->selected($request)->count();

### 快速参考表

// Get filter by key
$resource->filters->get($key);

// Set filter by key
$resource->filters->set($key, $value);

// Get all filters
$resource->filters->items;

// Get selected filters
$resource->filters->selected($request);

致谢

灵感来源于 Laravel Nova

许可证

MIT许可证(MIT)。请参阅 许可证文件 获取更多信息。