Laravel - 可重用的资源控制器

时间:2018-05-04 19:48:45

标签: php laravel laravel-5 laravel-5.6

我正在修改我在项目中使用的CMS,最近我决定为默认操作pip3创建一个控制器,其中所有其他控制器将扩展此控制器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);
    }
}

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:7)

评论之后,我可以更好地理解。 我在这里遇到了同样的问题,这是我的解决方法

class BaseController extends Controller
{

     protected function _store($request)
     {
     ....
     }
 ...
 }

 class MyController extends BaseController
 {
 ....
      public function store(MyRequest $request)
      {
          //do something
          return parent::_store($request);
      }
 }

答案 1 :(得分:2)

您将使用的任何CustomFormRequest都是FormRequest的实例。这个类反过来扩展Request类。所以在BaseController执行此操作:

BaseController.php

use Illuminate\Http\Request;

// some code

    public function store(Request $request)
    {
        $item = $this->model::create($request->all());

        return redirect()
            ->route($this->viewFolder.'.'.$this->viewType.'.show', item[$this->key]);
        }

// The rest of your code..

然后在您的孩子控制器中:

AChildController.php

class AChildController extends BaseController
{

use App\Http\Requests\ACustomFormRequest;

// Some code

  public function store(ACustomFormRequest $request)
  {
      //do something
      return parent::_store($request);
  }

}

试一试。

答案 2 :(得分:1)

class BaseController extends Controller
{

     protected function _store($request)
     {
     ....
     }
 ...
 }

 class MyController extends BaseController
 {
 ....
      public function store(MyRequest $request)
      {
          //do something
          return parent::_store($request);
      }
 }