bashirsh/laravel_easy_controller

以快速、简单和完全自定义的方式构建API资源控制器。

v1.0.5 2019-09-16 09:06 UTC

This package is auto-updated.

Last update: 2024-09-16 20:15:31 UTC


README

以快速、简单和完全自定义的方式构建资源控制器和API控制器。

内容

特性

索引特性

  • 过滤
  • 查询钩子
  • 分页
  • 限制
  • 排序与排序方式
  • 转换行
  • 导出到Excel(当前页面或全部结果)。

表单特性

  • 验证
  • 在存储之前更改数据
  • 重定向
  • 保存后钩子

删除特性

  • 重定向
  • 保存后钩子

安装

composer require bashirsh/laravel_easy_controller

API控制器

要创建新的API控制器,我们需要扩展 ApiController 类,

app/Http/Controllers/Api/UsersController.php

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
}

这个类将创建一个完整的资源控制器,包含以下方法:

  • index
  • show
  • store
  • update
  • delete

然后我们需要将资源添加到路由中。

routes/api.php

...
Route::apiResource('users', 'UsersController');
...

CRUD控制器

要创建新的控制器,我们需要扩展 CrudController

控制器

app/Http/Controllers/UsersController.php

use bashirsh\laravel_easy_controller\CrudController;

class UsersController extends CrudController {
    protected $viewPath = 'admin.users';
    protected $model = '\App\Models\User';
    protected $resource = 'admin.users';
}

这个类将创建一个完整的资源控制器,包含以下方法:

  • index
  • show
  • 添加
  • store
  • 编辑
  • update
  • delete
  • 导出到Excel

然后我们需要将资源添加到路由中,并创建视图文件。

路由

routes/web.php

...
Route::resource('users', 'UsersController');
Route::get('users_excel', 'UsersController@excel');
...

视图

在视图目录中创建4个文件
resources/views/admin/users/index.blade.php
控制器将传递变量 $data,它包含 Model::paginate() 的结果

resources/views/admin/users/show.blade.php
控制器将传递变量 $item,它包含 Model::find($id) 的结果

resources/views/admin/users/create.blade.php 我们可以打印验证错误

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

resources/views/admin/users/edit.blade.php
控制器将传递变量 $item,它包含 Model::find($id) 的结果

钩子

该包包含许多钩子,可以帮助您在控制器中自定义任何内容,您可以在以下位置查看它们: 钩子

索引钩子

索引查询钩子

该包将默认处理分页、限制和过滤,并且我们可以更改查询,例如添加条件或使用预加载。

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
    
    function indexQueryHook($query){
        $query->where('user_type', 'admin');
        return $query;
    }
}

定义过滤

我们通过定义允许的过滤条件来定义它们。

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
    
    public function filter_fields(){
        return [
            [
                // field equal to name by default
                // and the default condition is '='
                'name'=>'id'
            ],
            [
                'name'=>'name',
                'field'=>'name',
                'cond'=>'like'
            ]
        ];
    }
}

转换行

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';

    public function index_transformer($item){
        $item->new_value = 'test';
        $item->other_value = 'test 2';
        
        return $item;
    }
}

表单钩子

定义验证规则

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
    
    public function add_rules(){
        return [
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required',
        ];
    }

    public function edit_rules($item){
        return [
            'name' => 'required',
            'email' => [
                'required',
                Rule::unique('users')->ignore($item->id),
            ],
        ];
    }
}

在存储之前更改数据

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
    
    protected function prepare_data_to_add($data)
    {
        $data->created_by = Auth::ID();    
        return $data;
    }

    protected function prepare_data_to_update($data)
    {
        $data->updated_by = Auth::ID();
        return $data;
    }
}

重定向

您可以定义 redirect_url 在保存、更新或删除后进行重定向

并且您可以使用以下方法进行自定义

  • add_redirect_url
  • edit_redirect_url
  • destroy_redirect_url
use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
    
    /**
     * $item: the affected object
     */
    protected function redirect_url($item)
    {
        return route('users.index');
    }
    
    protected function add_redirect_url($item)
    {
        return route('users.show', [$item->id]);
    }

    protected function edit_redirect_url($item)
    {
        return route('users.show', [$item->id]);
    }

    protected function destroy_redirect_url($item)
    {
        return route('users.index');
    }
}

保存后钩子

use bashirsh\laravel_easy_controller\ApiController;

class UsersController extends ApiController {
    protected $model = '\App\Models\User';
    
    // used for both save and update
    protected function afterSaveHook($item, $request)
    {
        // do whatever you want
    }
    
    protected function afterUpdateHook($item, $request)
    {
        // do whatever you want
    }

    protected function afterStoreHook($item, $request)
    {
        // do whatever you want
    }
}