bashirsh / laravel_easy_controller
以快速、简单和完全自定义的方式构建API资源控制器。
Requires
- php: ^7.1.3
- laravel/framework: ^5.5
- maatwebsite/excel: ^3.1
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
}
}