dgoring / laravel-inherit-resource
Laravel的快速迷你资源控制器
4.1.1
2023-08-24 21:39 UTC
Requires
- php: ^7.1.3|^8.0
- laravel/framework: ^7.0|^8.0|^9.0|^10.0
- v4.x-dev
- 4.1.1
- 4.1.0
- 4.0.2
- 4.0.1
- 4.0.0
- v3.x-dev
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2.0
- 3.1.0
- 3.0.0
- v2.x-dev
- 2.6.0
- 2.5.0
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.0
- 2.2.0
- 2.1.1
- 2.1.0
- 2.0.0
- v1.x-dev
- 1.3.0
- 1.2.0
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.0
- dev-fix/json_total_count
- dev-v2-new-features
- dev-new-features
- dev-laravel9-support
This package is auto-updated.
Last update: 2024-09-24 23:51:36 UTC
README
受ruby gem InheritResource启发
我为laravel带来了快速极简的资源控制器
基本用法
简单地将资源特质放在您的控制器中
namespace App\Http\Controllers; use Dgoring\Laravel\InheritResource\Resource; class UsersController extends Controller { use Resource; }
在您的路由文件中带有资源路由
Route::resource('users', 'UsersController');
所有资源函数都放置并针对该类运行,同时加载视图
所有设置都假设为控制器名称,因此UsersController
假设使用
App\User
作为模型类user
作为路由参数- 以下视图假定对应于各自资源函数 --
users.index
将传递给它的分页集合作为$users
--users.show
将传递给它的记录实例作为$user
--users.create
将传递给它的模型的新实例作为$user
--users.edit
将传递给它的记录实例作为$user
查询
要覆盖用于过滤索引页等操作的查询,可以覆盖collection
函数
class UsersController extends Controller { use Resource { collection as query; } protected function collection() { $query = $this->query(); if($search = request()->query('search')) { $query->where('name', 'like', "%{$search}%"); } return $query; } }
collection
函数还用于所有资源函数以提供基础查询,因此可用于在控制器中过滤内容
protected function collection() { $query = $this->query(); $query->where('active', 1); return $query; }
授权资源
默认情况下,所有操作都通过authorize函数进行,因此您可以控制对此资源的访问
index
->authorize(viewAny
, class)create
->authorize(create
, 新实例)store
->authorize(create
, 新实例)edit
->authorize(update
, 实例)update
->authorize(update
, 实例)destroy
->authorize(delete
, 实例)
验证规则
您可以通过定义validationRules
函数来指定store
和update
函数的验证规则
class UsersController extends Controller { use Resource; protected function validationRules() { if($this->resource()->exists) { return [ 'name' => 'string', ]; } else { return [ 'name' => 'string|required', ]; } } }
嵌套资源
嵌套资源同样简单
只需设置您的路由
Route::resource('teams.users', 'UsersController');
然后在集合函数中返回关系
use App\Team; class UsersController extends Controller { use Resource { collection as query; } protected function collection() { $team = Team::findOrFail(request()->route('team')); $query = $team->users(); if($search = request()->query('search')) { $query->where('name', 'like', "%{$search}%"); } return $query; } }
因为集合函数用于create
和store
函数,只要您从父模型返回关系,关系应保存到新记录,并且它也应已在create
视图变量中的模型中
JSON
此资源也准备好响应JSON请求,注意索引将在响应头中返回总计数作为Count
如果定义在适当的位置,将使用JsonCollection或JsonResource格式化程序来处理模型,即
namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { } namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UsersCollection extends ResourceCollection { }
您还可以允许仅JSON响应
namespace App\Http\Controllers; use Dgoring\Laravel\InheritResource\JsonResource; class UsersController extends Controller { use JsonResource; }
或仅HTML
namespace App\Http\Controllers; use Dgoring\Laravel\InheritResource\HtmlResource; class UsersController extends Controller { use HtmlResource; }
覆盖
命名空间
默认情况下,模型假设位于App
命名空间下,但您可以通过添加文件config/inherit_resource.php
来更改它
以下显示App\Models
的配置文件
以及JSON资源和集合的命名空间
<?php return [ 'namespace' => 'App\\Models\\', 'json_resources' => 'App\\Http\\Resources\\', 'json_collections' => 'App\\Http\\Collections\\', ];
控制器变量
class UsersController extends Controller { use Resource; public function __construct() { $this->class_name = CustomUser::class; // Model Class $this->instance_name = 'custom_user'; // Route parameter and name of variable passed to single record views $this->collection_name = 'customer_users'; // Name of variable passed to index view $this->authorize = false; // Switch to turn off authorize checks (default is on) $this->saveTransaction = true; // while enabled model save and delete function are performed within a database transaction $this->distinctFix = true; // if the query builder returns a distinct query, a fix will be applied to get the distinct count used for pagination $this->fillOnlyValidated = true; // while enabled only the validated fields will be allowed to be mass assigned to the model //Only for Resource and HtmlResource $this->view_ns = 'customer_users'; // dot notation path to views folder $this->views = [ // name of view used for each function 'index' => 'index', 'create' => 'form', 'show' => 'show', 'edit' => 'form', ]; } }
响应
这些响应函数可以覆盖,以便您可以对某些操作有完全定制的响应,而无需覆盖整个路由函数
class UsersController extends Controller { use Resource; protected function htmlIndex(); protected function htmlShow(); protected function htmlCreate(); protected function htmlStoreSuccess(); protected function htmlStoreFailure(); protected function htmlEdit(); protected function htmlUpdateSuccess(); protected function htmlUpdateFailure(); protected function htmlDestroySuccess(); protected function htmlDestroyFailure(); protected function jsonIndex(); protected function jsonShow(); protected function jsonStoreSuccess(); protected function jsonStoreFailure(); protected function jsonUpdateSuccess(); protected function jsonUpdateFailure(); protected function jsonDestroySuccess(); protected function jsonDestroyFailure(); }