dgoring/laravel-inherit-resource

Laravel的快速迷你资源控制器

4.1.1 2023-08-24 21:39 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函数来指定storeupdate函数的验证规则

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;
  }
}

因为集合函数用于createstore函数,只要您从父模型返回关系,关系应保存到新记录,并且它也应已在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();
}