tehekone / laravel-resources
Laravel 包
Requires
- php: >=7.0.0
- ext-json: *
- illuminate/console: 5.5.*||5.6.*||5.7.*||5.8.*
- illuminate/database: 5.5.*||5.6.*||5.7.*||5.8.*
- illuminate/http: 5.5.*||5.6.*||5.7.*||5.8.*
- illuminate/support: 5.5.*||5.6.*||5.7.*||5.8.*
- illuminate/view: 5.5.*||5.6.*||5.7.*||5.8.*
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^7.0
README
Laravel 资源
目录
##简介
##安装
您可以通过 composer 安装此包
composer require tehekone/laravel-resources
或者,将这些两行添加到您的 composer require 部分
{
"require": {
"tehekone/laravel-resources": "^0.3"
}
}
##用法
...
###定义资源
...
###定义过滤器
####选择过滤器
php artisan shine:filter UserType --select
每个选择过滤器包含两个方法: apply 和 options。apply 方法负责修改查询以实现所需的过滤器状态,而 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 参数。此过滤器定义了两个可能的值:admin 和 editor。
如上例所示,您可以利用传入的 $value 来修改您的查询。apply 方法应该返回修改后的查询实例。
####布尔过滤器
您可以使用 shine:filter --boolean Artisan 命令生成布尔过滤器。
php artisan shine:filter UserType --select
每个布尔过滤器包含两个方法:apply 和 options。apply 方法负责修改查询以实现所需的过滤器状态,而 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 参数。此过滤器定义了两个可能的值:admin 和 editor。
如上例所示,您可以利用传入的 $value 来修改您的查询。apply 方法应该返回修改后的查询实例。
####日期过滤器
您可以使用 shine:filter --date Artisan 命令生成日期过滤器。
php artisan shine:filter CreatedFilter --date
每个日期过滤器包含一个方法:apply。apply 方法负责修改查询以实现所需的过滤器状态。
在构建日期过滤器时,传递给 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)。请参阅 许可证文件 获取更多信息。