php - Laravel - 可重用的资源控制器
问题描述
我正在修改我在项目中使用的 CMS,最近我决定为默认操作创建一个控制器BaseController
,所有其他控制器都将扩展这个控制器BaseController
。
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
class BaseController extends Controller
{
protected $viewFolder = 'admin';
protected $title;
protected $model;
protected $key = 'id';
protected $files = [];
public function __construct()
{
$this->setVariable('title', $this->title);
}
public function index()
{
$items = $this->model::paginate();
$this->setVariable('items', $items);
return $this->viewRender('index');
}
public function create()
{
return $this->viewRender('create');
}
public function store(ExampleStoreRequestFROMEXAMPLECONTROLLER $request)
{
$item = $this->model::create($request->all());
return redirect()->route($this->viewFolder.'.'.$this->viewType.'.show', $item[$this->key]);
}
public function show($id)
{
$item = $this->model::where($this->key, $id)->firstOrFail();
$this->setVariable('item', $item);
return $this->viewRender('show');
}
public function edit($id)
{
$item = $this->model::where($this->key, $id)->firstOrFail();
$this->setVariable('item', $item);
return $this->viewRender('edit');
}
public function update(ExampleUpdateRequestFROMEXAMPLECONTROLLER $request, $id)
{
$item = $this->model::where($this->key, $id)->firstOrFail();
$item->update($request->except(['_token', '_method']));
return redirect()->route($this->viewFolder.'.'.$this->viewType.'.show', $item[$this->key]);
}
public function status(ExampleStatusRequestFROMEXAMPLECONTROLLER $request, $id)
{
$this->model::where($this->key, $id)->update($request->except('_method'));
return response()->json([
'message' => 'O status foi alterado com sucesso'
]);
}
public function destroy($id)
{
$this->model::where($this->key, $id)->delete();
return redirect()->route($this->viewFolder.'.'.$this->viewType.'.index');
}
}
BaseController
问题是:我使用表单请求编写了UserController
,我不知道如何让这些请求保持动态,以便我可以从其他控制器实现它们。
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\ExampleStatusRequest;
use App\Http\Requests\ExampleStoreRequest;
use App\Http\Requests\ExampleUpdateRequest;
class ExampleController extends BaseController
{
protected $viewType = 'users';
protected $model = 'App\Example';
public function index()
{
$this->setVariable('title', 'Usuários');
return parent::index();
}
public function create()
{
$this->setVariable('title', 'Cadastrar usuário');
return parent::create();
}
public function store(ExampleStoreRequest $request)
{
return parent::store($request);
}
public function edit($id)
{
$this->setVariable('title', 'Editar usuário');
return parent::edit($id);
}
public function update(ExampleUpdateRequest $request, $id)
{
return parent::update($request, $id);
}
public function status(ExampleStatusRequest $request, $id)
{
return parent::status($request, $id);
}
}
这是我的默认控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
protected $viewFolder = '';
protected $viewType = '';
protected $viewVariables = [];
protected function setVariable($key, $value)
{
$this->viewVariables[$key] = $value;
}
protected function viewRender($view)
{
return view($this->viewFolder.'.pages.'.$this->viewType.'.'.$view, $this->viewVariables);
}
}
知道如何解决这个问题吗?
解决方案
评论后我可以更好地理解。我在这里遇到了同样的问题,这是我的解决方法
class BaseController extends Controller
{
protected function _store($request)
{
....
}
...
}
class MyController extends BaseController
{
....
public function store(MyRequest $request)
{
//do something
return parent::_store($request);
}
}
推荐阅读
- c# - 使用两个列表中的项目创建第三个列表时遇到问题
- flask - 拦截来自 Flask restplus 命名空间类的验证错误
- javascript - nvd3 缺少一些 xAxis 刻度
- laravel - 如何根据出生日期仅获取特定年龄的用户
- python-3.x - 未找到 Prototxt 文件:
- android - Android - 绑定适配器不起作用
- java - 如何使用 JPA 标准 API 按透视值过滤/排序?
- python - 根据另一个列表中子字符串的顺序对列表进行排序
- css - 获取 Bootstrap 4 垂直药丸:与药丸对齐后
- reactjs - 当您按下后退按钮浏览器时,如何在反应中显示模态?