engency/resource-controllers

v0.5.5 2024-07-23 12:27 UTC

README

<Laravel Resources Badge>

不要浪费时间在编写Laravel应用的基本CRUD操作。

理念

大多数CRUD操作都非常直接,特别是当符合REST设计时。只要满足一些基本规则,通用的逻辑就可以完成任务。

  1. 中间件授权用户对资源进行操作
  2. 控制器确定作用域
  3. 规则在存储和更新资源之前验证输入
  4. 规则确保客户端只能接收到授权查看的属性

对于同时具有API和'通用'Web界面的应用程序,理想情况下只需要一个控制器来执行资源的基本CRUD操作。因此,通用的逻辑应该能够以HTML和JSON格式构造响应。

要求

  • PHP 7.1+ | PHP 8+
  • Laravel框架

安装

composer require engency/laravel-resource-controller

除了这个包之外,还会安装engency/eloquent-formattingengency/laravel-model-validation包。

用法

最基本的设置可能如下所示;

控制器

use Illuminate\Http\Request;
use Engency\Http\Controllers\ResourceController;
use Engency\Http\Controllers\DefaultResourceActions;

class UserController extends ResourceController
{
    use DefaultResourceActions;

    /**
     * Provide the resource class in the parent's constructor.
     * Add any middleware to authorize users.
     */
    public function __construct()
    {
        parent::__construct(User::class);
        
        $this->middelware('auth');
    }

    /**
     * Set the scope for this resource controller.
     * The expected return value should either be a query builder or a Laravel collection.
     * 
     * @param Request $request
     * @return \Illuminate\Database\Query\Builder|\Illuminate\Support\Collection|\Illuminate\Database\Query\Builder
     */
    protected function getScope(Request $request)
    {
        return User::query();
    }

}

模型

use \Illuminate\Database\Eloquent\Model;
use \Engency\ModelValidation\Validatable;
use Engency\DataStructures\CustomDataFormats;
use Engency\DataStructures\ExportsCustomDataFormats;

class User extends Model implements ExportsCustomDataFormats
{
    use Validatable; // trait required for laravel-model-validation
    use CustomDataFormats; // trait required for eloquent-formatting

    protected $fillable = [
        'name',
        'email'
    ];
    
    /**
     * Make sure clients only receive data they are authorized for.
     * Visit complete documentation on custom export formats on;
     * https://github.com/Engency/eloquent-formatting
     */
    protected $exports = [
        'default' => [
            'name',
        ],
        'complete' => [
            'name',
            'email'
        ]
    ];

    /**
     * Basic validation for resource attributes.
     * Visit complete documentation on model validation on;
     * https://github.com/Engency/laravel-model-validation
     */
    public function rules() : array {
        return [
            'name' => 'required|string',
            'email' => 'required|email'
        ];
    }   

}

HTML响应

控制器将查找以下视图;

  • resource-path/views/pages/resource-name-kebab-case/index.blade.php
  • resource-path/views/pages/resource-name-kebab-case/create.blade.php
  • resource-path/views/pages/resource-name-kebab-case/show.blade.php
  • resource-path/views/pages/resource-name-kebab-case/edit.blade.php

在index.blade.php文件中,默认将存在$items变量。index.blade.php文件可能如下所示;

<ul>
@foreach($items as $item)
    <li>{{ $item->name }}</li>
@endforeach
</ul>

任何显示资源的页面(显示和编辑)都可以访问资源。变量的名称是资源名称的驼峰命名。例如,'StreetSign'将是'$streetSign'。show.blade.php文件可能如下所示;

<p>You are viewing {{ $user->name }}.</p>
<p>The corresponding email address is {{ $user->email }}.</p>

此外,控制器使用特定的错误页面;

  • resource-path/views/pages/error/unauthorized.blade.php
  • resource-path/views/pages/error/notfound.blade.php
  • resource-path/views/pages/error/conflict.blade.php
  • resource-path/views/pages/error/forbidden.blade.php
  • resource-path/views/pages/error/500.blade.php

JSON响应

索引调用的响应

{
  "items": [
      {"name": "John"},
      {"name": "Doe"}
  ]
}

贡献者

  • Frank Kuipers (GitHub)
  • 请随时贡献或提交作为问题的功能请求。

许可

此插件受MIT许可的许可。